免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345
最近访问板块 发新帖
楼主: myworkstation

[C++] 【有奖讨论】随着 C++11 的巨大变化,谈谈你对新STL的展望 [复制链接]

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
发表于 2015-07-11 15:41 |显示全部楼层
本帖最后由 yulihua49 于 2015-07-11 17:33 编辑
陌路巨额投入 发表于 2015-07-11 15:25
1、你是否完整的了解过C++98: 2003 标准下的STL设计和实现,并且对你产生了怎么样的影响?
           说实 ...3、你对C++11标准下的STL有什么样的期望,新的STL特性目前有使用吗?
          对于新的STL的期望,能够出一些实用简单的类库,方便外部调用


类库里不知道外边的数据结构,这个就需要运行时模版了。离数据库泛型一步之遥。

论坛徽章:
32
CU大牛徽章
日期:2013-05-20 10:45:13每日论坛发贴之星
日期:2015-09-07 06:20:00每日论坛发贴之星
日期:2015-09-07 06:20:00数据库技术版块每日发帖之星
日期:2015-12-13 06:20:0015-16赛季CBA联赛之江苏
日期:2016-03-03 11:56:13IT运维版块每日发帖之星
日期:2016-03-06 06:20:00fulanqi
日期:2016-06-17 17:54:25IT运维版块每日发帖之星
日期:2016-07-23 06:20:0015-16赛季CBA联赛之佛山
日期:2016-08-11 18:06:41JAVA
日期:2016-10-25 16:09:072017金鸡报晓
日期:2017-01-10 15:13:292017金鸡报晓
日期:2017-02-08 10:33:21
发表于 2015-07-12 22:55 |显示全部楼层
1、你是否完整的了解过C++98: 2003 标准下的STL设计和实现,并且对你产生了怎么样的影响?
基本上都熟悉吧,毕竟STL大部分的内容都在项目中应用过了。
说到影响,STL简化了项目开发的难度,提高了开发效率。所以我很赞成使用STL。

2、你是否认同在开发同应该尽量使用STL,而不是自信的经常重复造轮子?
同意。
首先,STL标准模板库非常成熟,质量很高,在项目中可以直接使用,对项目的代码质量不会有任何影响。因此没必要重复造轮子,自行实现容器、迭代器等等。
STL内建在编译系统内,常用STL有Microsoft STL、HP STL、PJ STL、 SGI STL等。
没必要重复造轮子这个观点我非常赞同,不仅是STL,很多成熟的框架、库,一旦广泛地经受了项目的考验,那么都可以直接拿来加以应用,没必要重复开发同样的内容。
那么在什么场景下适合重复造轮子呢?我觉得有以下几种情况:
1)学习的场景
比如想理解容器的原理,就可以自己用代码实现容器,没必要用STL。
2)现有的“轮子”不能完全满足需求
这种情况下,我们可以基于现有的库进行扩展开发;也可以重新造一个轮子。

3、你对C++11标准下的STL有什么样的期望,新的STL特性目前有使用吗?
STL已经被视为C++的标准库了,像容器、迭代器、算法等等,在项目中经常使用。
STL的新特性也越来越复杂,很多特性在一般项目中还不容易用到。

4、对你来讲STL还有哪些是急需改进的地方。
这个问题对于不同的人有不同的看法。
我曾经期待的特性:make_unique、多态性的Lambdas表达式……

5、对于STL的未来你的预期是什么样的?
比如variable templates、polymorphic lambdas、lambda captures expressions、new/delete elision、relaxed restrictions on constexpr functions、binary literals、digit separators、return type deduction for functions、aggregate initialization for classes with brace-or-equal initializers等等。

论坛徽章:
4
IT运维版块每日发帖之星
日期:2015-08-04 06:20:00IT运维版块每日发帖之星
日期:2015-10-10 06:20:002015亚冠之阿尔艾因
日期:2015-11-08 10:27:01CU十四周年纪念徽章
日期:2020-11-05 14:10:23
发表于 2015-07-15 11:44 |显示全部楼层
1、你是否完整的了解过C++98: 2003 标准下的STL设计和实现,并且对你产生了怎么样的影响?
     没有完整了解过
2、你是否认同在开发同应该尽量使用STL,而不是自信的经常重复造轮子?
      还是根据需要吧,尽量使用
3、你对C++11标准下的STL有什么样的期望,新的STL特性目前有使用吗?
      新的特性还没用过
4、对你来讲STL还有哪些是急需改进的地方。
     把一些陷井尽量填上吧
5、对于STL的未来你的预期是什么样的?
     对lambda表达式等感兴趣

论坛徽章:
0
发表于 2015-07-15 11:52 |显示全部楼层
1、你是否完整的了解过C++98: 2003 标准下的STL设计和实现,并且对你产生了怎么样的影响?
   使用频率非常高,但是真正研究STL的设计和代码实现不多,只是因为调试程序bug针对性的看过vector,list。
      标准容器的使用有效的减少bug,让程序员更加专注于业务逻辑和架构设计,通用的算法等细节都有STL接管
          代码可读性提高,至少不会再有五花八门的类似STL代码让人抓狂,而且节省了很多阅读代码的时间
          个人使用template尤其C++11编程,但是有些嵌入式背景(C)的同事们可能不太喜欢,呜呜呜,这算是一个小副作用
          迭代器的设计真的很传神,一致性的访问做的太牛了
          STL 实现本身的注释风格很好,doxygen 还是很直观易用,但是里面的代码命名风格不太习惯,尤其是满是下划线开头的。
   
2、你是否认同在开发同应该尽量使用STL,而不是自信的经常重复造轮子?
    必须提倡,能用STL的就一定用。毋庸置疑,STL的实现简洁高效跨平台,绝大部分人其实写不出来可以与之媲美的“轮子”
        当然某些情况,比如特定嵌入式平台只能用C,那最好参考STL(或其他好的开源)的实现设计特定的需要的功能。
        如果只是想提升自己的coding能力,那可以去造轮子(相信你不会用在项目里面:))
        个人建议先使用STL,如果真的发现有问题,再去造轮子不迟(至少我没有遇到过这种情况)
3、你对C++11标准下的STL有什么样的期望,新的STL特性目前有使用吗?
        STL结合C++11特性让coding多了很多乐趣,软件架构也变得更加优雅,解耦更简单
          function和bind的结合简直是神器,个人喜欢用它来解耦,用来去掉讨厌的双向引用,让软件架构层级间保持单向引用,扩展时候相当简单
          右值也很惊艳,大大提升了效率(理论层面),所有的STL容器类都已经支持。move的使用可以有效节省内存的开销,很多容器都有in-place的插入,也省去了copy的开销,在这方面,STL极大的保持了C++高效的优势,很赞
          很喜欢auto,尤其是作为模板函数返回值推导的地方,以前不同的模板参数返回值不同的时候真是让人捉急
          shared_ptr终于可以返回原生指针了,哈哈哈,很多老代码接口可以满足了
          thread的出现也是很赞,跨平台不用我们关注了,各种同步也不错。就是要向本来习惯的pthread说再见了
          正则表达式姗姗来迟,至少不用再用system去调用外部处理了
4、对你来讲STL还有哪些是急需改进的地方。
   网络层面的早点标准化吧,至少socket先进入吧
5、对于STL的未来你的预期是什么样的?
  个人更觉得C++标准应该进化,提高更多的有用高效的特性,比如借鉴Function语言的,比如Python,Erlang等,里面的tuple,list 概念还是很赞的
  当然C++还是要保持简洁高效灵活,STL也一样。不能从boost移植太多的东西,一定是要通用,受众广的才能进入STL。那些矩阵计算等专业性很强的东东还是停留在boost里面吧。
  很多Java里面特性估计很难被复制。。。个人猜测,大家不用想太多。 c++不是要效率么

论坛徽章:
0
发表于 2015-07-15 12:14 |显示全部楼层
在用断点调试工具的时候如GDB,查看各种容器的内容真心不容易,很多函数是inline的,根本不让你print。gdb虽然可以用一些配置脚本,但是也不太方便。如果STL提供些内置的函数,调试起来就方便多了。另外,忍不住吐槽下STL的编译错误,还能再长点吗?不能再智能点么?

论坛徽章:
19
处女座
日期:2014-07-18 14:50:5415-16赛季CBA联赛之北京
日期:2019-09-16 15:39:1415-16赛季CBA联赛之上海
日期:2019-09-15 15:29:0415-16赛季CBA联赛之山西
日期:2017-03-09 10:58:232017金鸡报晓
日期:2017-02-08 10:33:212017金鸡报晓
日期:2017-01-10 15:13:2915-16赛季CBA联赛之深圳
日期:2016-12-15 17:55:53C
日期:2016-10-25 16:00:1515-16赛季CBA联赛之新疆
日期:2016-07-21 14:02:0415-16赛季CBA联赛之江苏
日期:2016-06-30 12:15:04shanzhi
日期:2016-06-17 17:59:31平安夜徽章
日期:2015-12-26 00:06:30
发表于 2015-07-18 23:50 |显示全部楼层
本帖最后由 shenlanyouyu 于 2015-07-19 01:17 编辑

最近认真学习了C++11带来的变化,分享给大家。

关于C++标准的更新需要很长的时间,并且也没有达到完美的程度。从03到11,几乎是10年才更新。在这本书中,作者也做出了解释,标准的制订,是许多人和公司的工作才能完成的,需要他们提供建议,互相讨论,并等待他们的实现和测试。没有一个人是full-time为C++标准工作,标准不是一个公司投入大量人员来完成的结果,而是许多人和公司的共同努力达成的结果。

C++ 11 STL带来的变化:
1.取消Template表达式中的空格:
vector<list<int> >; // OK in each C++ version
vector<list<int>>; // OK since C++11

2. nullptr 和std::nullptr_t
C++ 11中使用nullptr来代替0或者NULL,nullptr能够被转换到任何指针类型,但是不能转换到int。以前使用0来表示空指针的,但由于0可以被隐式类型转换为整形,这就会存在一些问题。
3. auto动态类型
在C++ 11中,使用auto可以在声明一个变量或对象时可以不指定数据类型,通知编译器去根据初始化代码推断所声明变量的真实类型例如:
auto i = 42; // i has type int
double f();
auto d = f(); // d has type double
auto i; // ERROR: can’t dedulce the type of i

4.更强大的for循环

C++ 11提供了功能更强大的for循环,指定循环的范围,数组等,功能更加灵活强大。

for ( decl : coll ) {

statement

}

for ( int i : { 2, 3, 5, 7, 9, 13, 17, 19 } ) {

std::cout << i << std::endl;

}

5.    Rvalue右值引用
我个人认为Rvalue是C++ 11中引入最重要的功能,避免不必要的拷贝和缓存,解决部分以前STL中存在的内存使用率较低的问题。

6.    noexcept

C++ 11提供的keyword noexcept主要用于表明函数不能抛出异常或者准备抛出异常。

7.    constexpr

constexpr确保表达式在编译的时候进行计算,例如

constexpr int square (int x)

{

return x * x;

}

float a[square(9)]; // OK since C++11: a has 81 elements

8.    可变参数的Templates

9.    Lambdas

匿名函数从函数式编程中借来的强大特性,使很多其他特性以及类库得以实现。可以在任何使用函数对象或者函子(functor)或std::function的地方使用lambda。

10.  decltype

decltype 可以让编译器确定表达式的类型,例如:

std::map<std::string,float> coll;

decltype(coll)::value_type elem;

11.  Smart Pointers 智能指针

unique_ptr: 如果内存资源的所有权不需要共享,就应当使用unique_ptr,它没有拷贝构造函数,但是它可以转让给另一个unique_ptr(存在move构造函数)。
shared_ptr: 如果内存资源需要共享,那么使用shared_ptr。
weak_ptr: 持有被shared_ptr所管理对象的引用,但是不会改变引用计数值。它被用来打破依赖循环。
auto_ptr:已经被废弃,不会再使用了。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
发表于 2015-07-31 19:17 |显示全部楼层
本帖最后由 yulihua49 于 2015-07-31 19:21 编辑
jieforest 发表于 2015-07-12 22:55
1、你是否完整的了解过C++98: 2003 标准下的STL设计和实现,并且对你产生了怎么样的影响?
基本上都熟悉吧 ...2)现有的“轮子”不能完全满足需求
这种情况下,我们可以基于现有的库进行扩展开发;也可以重新造一个轮子。

我就干过一次用自己的轮子替换STL。STL效率太低了,在迭代map时。
那个项目因效率太低无法投产而被改造,改造后效率够了,投产。

论坛徽章:
32
CU大牛徽章
日期:2013-05-20 10:45:13每日论坛发贴之星
日期:2015-09-07 06:20:00每日论坛发贴之星
日期:2015-09-07 06:20:00数据库技术版块每日发帖之星
日期:2015-12-13 06:20:0015-16赛季CBA联赛之江苏
日期:2016-03-03 11:56:13IT运维版块每日发帖之星
日期:2016-03-06 06:20:00fulanqi
日期:2016-06-17 17:54:25IT运维版块每日发帖之星
日期:2016-07-23 06:20:0015-16赛季CBA联赛之佛山
日期:2016-08-11 18:06:41JAVA
日期:2016-10-25 16:09:072017金鸡报晓
日期:2017-01-10 15:13:292017金鸡报晓
日期:2017-02-08 10:33:21
发表于 2015-08-03 13:57 |显示全部楼层
回复 47# yulihua49


赞一个。从常规情况来看,STL是很成熟的,代码的执行效率低通常是研发团队自己的代码实现的质量不高,或者是对STL存在误用之类的情况。
就本身而言,我没遇到过STL代码低效的情况。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
发表于 2015-08-03 14:59 |显示全部楼层
本帖最后由 yulihua49 于 2015-08-03 15:04 编辑
jieforest 发表于 2015-08-03 13:57
回复 47# yulihua49

主要发现map迭代比较慢。比如我需要找<,<=key 的,map不提供这种操作,用lowbound,再iterator--,极慢。
自己实现的,提供GT,GTEQ,LT,LTEQ操作,直接定位,效率高了很多。
再说我这个轮子造了很多年了,可能比STL的历史还要悠久,用在很多项目中,已经非常成熟可靠高效的了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP