免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: doswin
打印 上一主题 下一主题

c++程序员是不是蛋疼啊? [复制链接]

论坛徽章:
0
21 [报告]
发表于 2012-05-08 16:58 |只看该作者
这方面不是人人都可以说学习就习的,主要看个人想法心态!

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
22 [报告]
发表于 2012-05-08 17:27 |只看该作者
回复 20# doswin

这么做会遇到麻烦的,看看python 2.x中unicode的支持就知道了,那个混乱啊~~~ python 3中字符串一律用unicode标识,要输入输出了才进行编解码
   

论坛徽章:
0
23 [报告]
发表于 2012-05-08 17:39 |只看该作者
koolcoy 发表于 2012-05-08 17:27
回复 20# doswin

这么做会遇到麻烦的,看看python 2.x中unicode的支持就知道了,那个混乱啊~~~ python  ...

你说的是unicode啊,不是utf8.

论坛徽章:
0
24 [报告]
发表于 2012-05-09 01:07 |只看该作者
AD8018 发表于 2012-05-08 16:04
口水仗多说无益。
不如大家投票下,最想要stl的string支持哪些函数。

     void trim_left(const char *s = "\r\n \t");   //对this字符串进行左侧修剪
     void trim_right(const char *s = "\r\n \t"); //对this字符串进行右侧修剪
     void trim(const char *s = "\r\n \t");          //对this字符串进行两端修剪

     template<class C>
     void split(const char *s, C &c);   //用s作为分割符,将this字符串分割,结果push_back进容器c

     template<class C>
     string join(C &c);      //用this字符串作为连接符,将容器c中的字符串连接起来,返回连接后的字符串。


replace_all 替换所有
regexp_replace 用法参见oracle
regexp_substr 用法参见oracle

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
25 [报告]
发表于 2012-05-09 13:45 |只看该作者
本帖最后由 captivated 于 2012-05-09 13:46 编辑

C++本身就蛋疼. 哥就不批评C++程序员了.

C++就TMD是一门蠢才用的蠢语言.

论坛徽章:
0
26 [报告]
发表于 2012-05-09 13:49 |只看该作者
captivated 发表于 2012-05-09 13:45
C++本身就蛋疼. 哥就不批评C++程序员了.

C++就TMD是一门蠢才用的蠢语言.

   顶一个哈

论坛徽章:
0
27 [报告]
发表于 2012-05-09 14:47 |只看该作者
回复 13# L_kernel
C++ string有容器和算法以外的问题。
最大的问题之一就是缺少可定制的策略,接口层次不上不下,即便不考虑兼容,也既无法完全取代C风格字符串又没法随便用而不担心效率。
拿到一个C++ string:
1.你知道它内部就有个NTCTS?
2.你知道它是不是使用引用计数/COW实现么?
C++11通过增加限制基本解决了第一点,但是第二点无法做到。
第二个问题是对编码的支持扩充困难,尤其是涉及到MBCS——说白了也是接口意义上混乱:到底是byte string还是character string?string的元素是code point还是character?实际都是前者,但有时候不得不当后者来用。

论坛徽章:
0
28 [报告]
发表于 2012-05-09 14:48 |只看该作者
回复 25# captivated

不足以了解自己的愚蠢的人大都不敢用。
   

论坛徽章:
0
29 [报告]
发表于 2012-05-09 14:50 |只看该作者
回复 18# AD8018


这些相比我上面提到过的来说都是小意思了——用现有的接口就可以自行实现。反正没有弄成成员函数的必要。
也就split稍微复杂点,不过原因还是问题本身就麻烦,而不是因为用了C++ string于是实现起来才麻烦。

论坛徽章:
0
30 [报告]
发表于 2012-05-09 14:59 |只看该作者
回复 18# AD8018

嘛……实现上会有些问题,不过涉及core language features了。
比如trim的默认参数,考虑string就很好写,但光是考虑basic_string的其它实例就麻烦了(懒得特化党在此)……
一个罗嗦的解决方案:逐个元素弄成std::array,然后祈祷编译器会尽量优化掉……

  1. template<typename _type, size_t _vN, typename _tSrc>
  2. constexpr std::array<_type, _vN>
  3. make_array(const _tSrc& src)
  4. {
  5.         return std::array<_type, _vN>(src);
  6. }
  7. template<typename _type, size_t _vN>
  8. constexpr std::array<_type, _vN>
  9. make_array(const std::array<_type, _vN>& src)
  10. {
  11.         return src;
  12. }
  13. template<typename _type, size_t _vN, typename _tSrcElement>
  14. inline std::array<_type, _vN>
  15. make_array(const _tSrcElement(&src)[_vN])
  16. {
  17.         using namespace std;

  18.         array<_type, _vN> arr;

  19.         copy_n(addressof(src[0]), _vN, addressof(arr[0]));
  20.         return std::move(arr);
  21. }
  22. template<typename _type, size_t _vN, typename _tSrcElement>
  23. inline std::array<_type, _vN>
  24. make_array(_tSrcElement(&&src)[_vN])
  25. {
  26.         using namespace std;

  27.         array<_type, _vN> arr;

  28.         copy_n(make_move_iterator(addressof(src[0])), _vN, addressof(arr[0]));
  29.         return std::move(arr);
  30. }
  31. template<typename _tString>
  32. struct string_traits
  33. {
  34.         typedef typename std::remove_reference<_tString>::type string_type;
  35.         typedef typename string_type::value_type value_type;
  36.         typedef typename std::char_traits<value_type> traits_type;
  37.         typedef value_type* pointer;
  38.         typedef const value_type* const_pointer;
  39.         typedef std::initializer_list<value_type> initializer;
  40. };
  41. template<class _tString>
  42. inline _tString&
  43. ltrim(_tString&& str, typename string_traits<_tString>::const_pointer t
  44.         = &make_array<typename string_traits<_tString>::value_type>("\n\r\t\v ")[0])
  45. {
  46.         return str.erase(0, str.find_first_not_of(t));
  47. }
  48. template<class _tString>
  49. inline _tString&
  50. rtrim(_tString&& str, typename string_traits<_tString>::const_pointer t
  51.         = &make_array<typename string_traits<_tString>::value_type>("\n\r\t\v ")[0])
  52. {
  53.         return str.erase(str.find_last_not_of(t) + 1);
  54. }
  55. template<class _tString>
  56. inline _tString&
  57. trim(_tString&& str, typename string_traits<_tString>::const_pointer t
  58.         = &make_array<typename string_traits<_tString>::value_type>("\n\r\t\v ")[0])
  59. {
  60.         return ltrim(rtrim(str, t));
  61. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP