V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Tinet
V2EX  ›  程序员

C++ STL的一点疑惑

  •  
  •   Tinet ·
    inetkiller · 2013-05-12 20:26:46 +08:00 · 4934 次点击
    这是一个创建于 3973 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近在看C++的STL,确实非常强大,实现了常用的一些数据结构和通用的一些算法,有种从原始社会过度到石器时代的赶脚。
    我没有做过具体的C++项目,所以有问题想请教:
    实际项目中会大量用到STL里面的数据结构吗?STL在实际工程中性能如何?是不是一种必需掌握的技术?
    25 条回复    1970-01-01 08:00:00 +08:00
    jybox
        1
    jybox  
       2013-05-12 20:32:49 +08:00
    vector, map, 还有些常见算法, 显然很常用, 应该算是必须掌握的.
    STL因为通用性牺牲了一些性能, 应该不如你专为单一问题特别编写的算法, 但你很难写出性能更高的同样的通用算法了.
    Tinet
        2
    Tinet  
    OP
       2013-05-12 20:46:28 +08:00   ❤️ 1
    @jybox 那在实际的工程中你们会选择编写特定的算法还是直接用STL里面的数据结构与算法
    bengol
        3
    bengol  
       2013-05-12 21:24:39 +08:00
    一般大型的公司/项目都有自己的基础设施框架
    Tinet
        4
    Tinet  
    OP
       2013-05-12 21:43:39 +08:00
    @bengol 就是说底层很多东西都已经做好了吗,比如排序,查找接口什么的
    middleware
        5
    middleware  
       2013-05-12 21:53:19 +08:00
    对于通常 size 在 20 以下的小集合会用。大集合尽量少用。遇到瓶颈就毫不留情的 replace 掉。
    Tinet
        6
    Tinet  
    OP
       2013-05-12 22:11:15 +08:00
    @middleware 那这个对于一般数据处理(比如一般的网站的数据)是没什么用咯?
    bengol
        7
    bengol  
       2013-05-12 23:33:38 +08:00
    @Tinet 是的
    funcman
        8
    funcman  
       2013-05-13 00:15:07 +08:00
    存指针而不是对象,性能基本上没有太大问题,也有助于减少bug。
    实际项目中应用STL还是很多的,如果你是C++程序员,STL是必须学习的技术。
    middleware
        9
    middleware  
       2013-05-13 09:11:50 +08:00
    @Tinet 可以这么说。而且链表设计得尤其糟糕。见我写的一篇 blog:
    http://sipoint.wordpress.com/2009/12/15/链表迷魂阵/
    vietor
        10
    vietor  
       2013-05-13 09:19:18 +08:00
    用STL库的时候,最重要的是:自己不要有写算法的冲动,寻找STL中已经实现的,可能会“绕一些弯”,但值得。STL的性能不用担心,因为大部分都采用inline方式实现,编译器能够优化的。最常用的就是map和list,因为接口都差不多,根绝性能要求替换实现也是很简单的,比如将list替换成vector
    chchwy
        11
    chchwy  
       2013-05-13 12:15:03 +08:00   ❤️ 1
    我現在參與的項目是是個大約十萬行代碼的三維動畫軟件,基本方針是能用STL就盡量用STL。
    相對於性能開銷,STL代碼的可靠度帶來的好處更多。而且現代compiler的優化技術非常好,下了-O2選項後,vector跟原生數組的性能差異微乎其微。
    txx
        12
    txx  
       2013-05-13 12:20:50 +08:00 via iPhone
    必须是能用stl 绝对要用stl。就拿sort 来说。stl 会分析数据选择一个合适的算法排序 在深度什么情况下用heap 什么情况下用 qsort 什么情况下用基数 等等

    人肉实现 一般情况下都不如 stl的
    Tinet
        13
    Tinet  
    OP
       2013-05-13 12:34:47 +08:00
    @txx 这么智能啊,什么叫人肉实现?
    hooluupog
        14
    hooluupog  
       2013-05-13 12:40:43 +08:00
    stl还是值得信赖的,我私底下自己实现过一些算法,用原生的数组去做发现性能不比stl高多少。另外gcc 4.8已经用c++实现,里面就使用了stl。
    mozartgho
        15
    mozartgho  
       2013-05-13 12:46:53 +08:00
    @Tinet 实际项目中STL是必须的,性能不用担心,自己写算法很难达到STL的性能,不要怀疑大师们的能力。
    matthewgao
        16
    matthewgao  
       2013-05-13 12:56:34 +08:00
    反正我的项目中是用的
    Tinet
        17
    Tinet  
    OP
       2013-05-13 12:58:17 +08:00
    @matthewgao 现在看来STL是必学的了,没白看这么久的英文原版书,我要进入石器时代咯
    wenLiangcan
        18
    wenLiangcan  
       2013-05-13 13:18:31 +08:00   ❤️ 1
    歪一下楼,有人写了个C的: https://code.google.com/p/libcstl/
    txx
        19
    txx  
       2013-05-13 13:36:59 +08:00
    @Tinet 就是自己写 快排啊 红黑树啊 之类的
    daoluan
        20
    daoluan  
       2013-06-04 19:56:53 +08:00
    要看你是什么实际的项目,如果涉及 C++ 的地方,STL 都会有一席之地的。你学 STL 未必是为了用它,里面可以学到很多的数据结构和算法,这些对各个方向上的程序员来说都是基本素质的东西,不能不学,STL 只是更为深入。

    @wenLiangcan 这个好强。
    Ricepig
        21
    Ricepig  
       2013-06-04 20:28:40 +08:00 via iPhone
    "有种从原始社会过度到石器时代的赶脚"
    黑得漂亮!
    Golevka
        22
    Golevka  
       2013-06-04 21:07:00 +08:00
    其实我是冲着STL里面的一堆高阶函数去的. 我感觉STL配合lambda能秒o|o十条街
    chmlai
        23
    chmlai  
       2013-06-04 21:22:31 +08:00
    如果不让用STL, 那我连C++都不用了.
    cluries
        24
    cluries  
       2013-06-04 21:27:13 +08:00
    为什么项目中不能大量使用STL呢?我们反正是大量使用的.
    STL有几种实现,不同实现性能差异还是比较大的.
    然后就是STL中大坑小坑都不少,建议啃一下 Effective STL
    BOYPT
        25
    BOYPT  
       2013-06-05 11:40:51 +08:00
    STL是工程用料,工程上应该尽量使用。

    这个跟在学校的“编程课”要求是不一样的,高校ACM里面经常你用STL提交的话还会因为超内存被挂。(学院派的去工程化是很多ACM大牛的代码质量那么差的原因~)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   979 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 327ms · UTC 20:27 · PVG 04:27 · LAX 13:27 · JFK 16:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.