c++学习数据结构应不应该用stl实现

对于一个C++学习者和使用者而言,自己实现一个STL标准库,对他的意义有多大? - 知乎93被浏览10288分享邀请回答6添加评论分享收藏感谢收起311 条评论分享收藏感谢收起查看更多回答新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 111, 距离下一级还需 89 积分
论坛徽章:0
我的习惯是:
& & & & 1. 使用 printf 之类的 C 函数,而不使用 iostream .
& & & & 2. 使用 C 的字符串函数,而不使用 string 类。
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
丰衣足食, 积分 789, 距离下一级还需 211 积分
论坛徽章:0
你项目中的实际功能需要往标准输出吗?
我一般用cout,主要是有些类型不好确定,比如我忘记了time_t的实际类型,要用printf的话,就不知道是%d还是%u还是%lld
不过有些情况还是printf好,比如循环往console打印信息,再clear,如果用cout就刷的很慢。
我有个项目,一个不太要求性能的服务器,用的string。c字符串函数似乎太过麻烦。
腰缠万贯, 积分 9970, 距离下一级还需 30 积分
论坛徽章:231
那不能说是混合编程网站已改版,请使用新地址访问:
dsa STL c++部分实现,邓俊辉清华《数据结构》课程同步代码,可作为 练习 STL 238万源代码下载-
&文件名称: dsa
& & & & &&]
&&所属分类:
&&开发工具: Visual C++
&&文件大小: 814 KB
&&上传时间:
&&下载次数: 3
&&提 供 者:
&详细说明:STL c++部分实现,邓俊辉清华《数据结构》课程同步代码,可作为数据结构练习-STL c++ partially achieved, Deng Junhui Tsinghua &quot Data Structures&quot
course synchronization code, can be used as a data structure to practice
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&dsa\src\_ps\2009.ps&&...\...\...\2010.ps&&...\...\...\2011.ps&&...\...\...\smile.ps&&...\...\laby\advance.h&&...\...\avl\avl.h&&...\...\...\avl_implementation.h&&...\...\...\avl_insert.h&&...\...\...\avl_macro.h&&...\...\...\avl_remove.h&&...\...\...\avl_test.h&&...\...\bintree\binnode.h&&...\...\.......\binnode_implementation.h&&...\...\.......\binnode_insert.h&&...\...\.......\binnode_macro.h&&...\...\.......\binnode_macro_avl.h&&...\...\.......\binnode_macro_basic.h&&...\...\.......\binnode_macro_redblack.h&&...\...\.......\binnode_size.h&&...\...\.......\binnode_stretchbyzag.h&&...\...\.......\binnode_stretchbyzig.h&&...\...\.......\binnode_succ.h&&...\...\.......\binnode_travinorder.h&&...\...\.......\binnode_travinorder_i1.h&&...\...\.......\binnode_travinorder_i2.h&&...\...\.......\binnode_travinorder_i3.h&&...\...\.......\binnode_travinorder_i4.h&&...\...\.......\binnode_travinorder_r.h&&...\...\.......\binnode_travlevel.h&&...\...\.......\binnode_travpostorder.h&&...\...\.......\binnode_travpostorder_i.h&&...\...\.......\binnode_travpostorder_r.h&&...\...\.......\binnode_travpreorder.h&&...\...\.......\binnode_travpreorder_i1.h&&...\...\.......\binnode_travpreorder_i2.h&&...\...\.......\binnode_travpreorder_r.h&&...\...\.......\binnode_zag.h&&...\...\.......\binnode_zig.h&&...\...\.......\bintree.h&&...\...\.......\bintree_attach.h&&...\...\.......\bintree_implementation.h&&...\...\.......\bintree_insert.h&&...\...\.......\bintree_remove.h&&...\...\.......\bintree_secede.h&&...\...\.......\bintree_size.h&&...\...\.......\bintree_test.h&&...\...\.......\bintree_updateheight.h&&...\...\..tmap\bitmap.h&&...\...\......\bitmap_o1_init.h&&...\...\......\bitmap_o1_init_set_only.h&&...\...\.st\bst.h&&...\...\...\bst_connect34.h&&...\...\...\bst_implementation.h&&...\...\...\bst_insert.h&&...\...\...\bst_remove.h&&...\...\...\bst_removeat.h&&...\...\...\bst_rotateat.h&&...\...\...\bst_search.h&&...\...\...\bst_searchin_iterative.h&&...\...\...\bst_searchin_recursive.h&&...\...\...\bst_test.h&&...\...\.tree\btnode.h&&...\...\.....\btree.h&&...\...\.....\btree_implementation.h&&...\...\.....\btree_insert.h&&...\...\.....\btree_remove.h&&...\...\.....\btree_search.h&&...\...\.....\btree_solveoverflow.h&&...\...\.....\btree_solveunderflow.h&&...\...\.....\btree_test.h&&...\...\laby\cell.h&&...\...\_share\checkorder_elem.h&&...\...\......\checkorder_list.h&&...\...\......\checkorder_vector.h&&...\...\......\comparator.h&&...\...\conversion\convert.h&&...\...\_share\crc_elem.h&&...\...\......\crc_list.h&&...\...\......\crc_vector.h&&...\...\cursor_list\cursor_list.h&&...\...\...........\cursor_list_implementation.h&&...\...\simu\customer.h&&...\...\_share\decrease_elem.h&&...\...\......\decrease_list.h&&...\...\......\decrease_vector.h&&...\...\dictionary\dictionary.h&&...\...\laby\displaylaby.h&&...\...\_share\double_elem.h&&...\...\......\double_vector.h&&...\...\entry\entry.h&&...\...\prime\eratosthenes.h&&...\...\factorial\fac.h&&...\...\.ibonacci\fib.h&&...\...\graph\graph.h&&...\...\.....matrix\graphmatrix.h&&...\...\.....\graph_bcc.h&&...\...\.....\graph_bfs.h&&...\...\.....\graph_bfs_pu.h&&...\...\.....\graph_dfs.h&&...\...\.....\graph_dfs_pu.h
&近期下载过的用户:
&输入关键字,在本站238万海量源码库中尽情搜索:
&[] - Example C++ STL
Muser D. and Sane A book
&[] - 清华邓俊辉数据结构教程配套源码,学习数据结构的好帮手
&[] - EFFECTIVE STL,用于使用STL的很好的参考书籍C++中的STL标准库到底该不该用?
我正在做一个软件,因为是C++开发,所以我当时就决定了使用STL标准库,到目前为止,所有的字符串、链表等全部都是用的STL。
但是我最近越来越感到不舒服,STL好像并没有我认为的好用。首先,我感觉到STL似乎有过度设计的现象,分来分去,弄得分出了分配器、迭代器一大堆概念。这让我感觉不安,项目慢慢的成长中,STL很可能会为我的项目带来副作用,虽然STL减少了大量的代码,但是我认为这种方式的减少是不良的。对,我想说的就是,STL好像是为了抽象而抽象,过度的设计导致了大量无关的概念,庞大又臃肿、晦涩难用。虽然如此,但是我还是不能确定是该及时取消STL还是继续坚持STL,我的项目刚做完核心,还没有建立起来,我不想就这么毁了。
我不知道现在到底该如何做,是及时取消STL还是坚持,从确定有STL到现在有了一段时间了,已经有大量的代码使用了STL(还包括我为该项目的文件存储而创建的另一个库项目),如果取消那么将耗费时间在修改上,而且代码充斥着大量依靠STL的细节,所以我现在感到不安。
大家能否给个建议?
如果是大项目,选择STL是一个很明智的选择,一个大项目,STL的庞大被弱化了,但是效率的提高确是绝对的,有STL的开源实现代码,如果实力够强,大可以精简STL,STL本身,C++本身就是为大项目而设计的嘛
哈。我也来凑个热闹。
首先,C++搞的不熟,不好说C++的STL好坏。(STL在C++中的好坏)
其次,如果换C,STL能做的事情,C里面一样可以很快做出来。
再次,STL和C的#define很像,经常被人喷,也经常被对应对高手熟练使用。
最后,如果涉及到底层或系统级的代码,最好不要用STL,虽然对C++不熟练,但至少知道STL生成的东西(优点所在),不是你可控的东西(也就是缺点)。
优点就是缺点,这个是经常发生的,哈。不是自身的错,而是环境或期望不同导致的。篮球运动员,中锋一般高大无比,让他去举重,我相信没人说这个身高是优势。
另外扯淡一句找喷的话题,C++的业务面真的很窄。程序无非是面向业务优先,还是面向设备优先。也即,为动态的业务服务,还是为优化硬件,OS,底层库服务。前者通常是真实世界的人性思维的角度看问题,后者 需要很务实的面向设备实现的角度看问题。所以前者用面向对象的多,但后者用面向对象的少。C++这个倒霉蛋就在于,现在属于两头都能靠上,两头都靠起来很不靠谱。
不做底层的朋友,不妨想想,现在有几个APP是用C++开发的?
做底层的朋友,也不妨想想,用C++的实现中,有多少代码是非C语言的面向对象逻辑的描述。同时这种描述的必要性在哪?
--- 共有 7 条评论 ---
: 用C的方式写C++,说明很多情况用不上C++的特性,C足够了
我对C++也不太熟,但是的确存在这个现象:很多人在以C的方式写着C++的程序。
底层或系统级的代码,最好不要用STL?会撸系统的就有本事自己发明好轮子了?照BeOS那套胡搞的玩意儿?
: 因为STL在编译时会生成相当大量模版代码, 有时候会有些非常诡异的问题,一般人很难真正预料到会产生怎样的模版代码。有些C项目也使用的是C++编译器或者标注为C++, 但也许他们只是用到了C++中很少很少的功能(例如const).
: 比起宏哥,中山野鬼算是比较客观的了,虽然我也不赞同野鬼找喷的那一段,哈~
引用来自“宏哥”的答案
引用来自“Lunar_Lin”的答案
引用来自“宏哥”的答案
引用来自“Lunar_Lin”的答案
为什么选择C++? 1.& 大公司的影响.& 电信公司/google/微软/应用软件厂商(adobe). 的确如果没有google, C++在被微软抛弃后, 流行性可能更要大跌. 2.& 应用领域. 绝大多数的桌面软件, 游戏服务器, PC游戏客户端, 一部分服务器应用开发, 一部分嵌入式软件. 你不用C++, 你和该领域就遥远. 3. 高效的本地语言, 如果你想带上语言的高级特性, 你只有C++可选.
4. 泛型编程. 如果你对此感兴趣, (当然这也是很多人疏远C++的原因), C++是你最正统的选择. &&&& STL有一些需要注意的操心点.但没有语言是可以不操心的,有什么语言你可一上来就胡写乱写不考虑细节吗? 没有. 如果是java, 那么这也是它产生了这世界上最多垃圾程序代码的原因.
如果你讨厌无数时间用来敲一大堆字符, 厌恶写pare(s1,s2); 想写& if( s1==s2)& 那么就使用C++吧 !(不过请先注意领域, 人必须要先活着再谈兴趣)
1. 大公司都严格限制可以使用的库. 可以很认真的告诉你, STL,Boost这种质量的库,大多时候都是被禁止使用的. 他们允许使用C++都在严格的限制下使用.
2. 桌面软件,游戏软件 C++主要就是做UI. 而UI部分,用C++开发的很少. 嵌入式,大多连C++的编译器都不支持. 除非是终端部分. 游戏逻辑,都有嵌入式语言支持.
3. 所有原语发布,都是C. 包括不限于 winapi, posix, directx, directsound,Com
4. 泛型如果用c来表达,就是增加一个参数,进行分支处理.C++把它搞复杂了. 用宏的话,比C++更简洁.
综上所述, C++基本上是在价值链的低端生存,而且非常低效. 至于用到STL,Boost的软件, 顶多也就是一些桌面软件的UI部分, 大多都是价值非常低的软件,而且质量非常糟糕.当然有些软件部署广泛,也有比较大的价值.&
不相信,可以自我衡量一下,是不是处在这样的价值链上.&
为什么C++这样复杂的语言, 相应的程序员收入却不好,做得却是最辛苦. 是有内生的原因.这个原因就是因为C++扼杀了他们的生产力.
&反观C, 更简洁, 待遇却好得多.
甚至这种语言制造了像 &bastetwang 这样的怪物,被C++强X之后,产生的斯德哥尔摩综合症,C++一天不FK他,他就不舒服.太神奇了.
引用野鬼的话,我能理解这种怪物. C++的工作,辛苦又不来钱,还有人鄙视.
0. 除了做应用软件的较低, C++工资较高, 你不必担心. 可以查语言工资排行. 至于C, 我只说想说你想找份只用C的工作不容易. 就像基金公司一样. 有些娱乐圈的明星很来钱, 但大多数走穴唱歌的人都是苦逼. 1. 我能说出一堆使用STL的公司,& 基本大家知道名字的公司都可以使用STL.(不熟悉STL,无法通过面试.)所有的电信公司, 所有的游戏公司, 腾讯, google,微软, 等等等. 我希望你列出哪家公司有条文: & 大家用STL时候注意了. 不准什么什么. & 2.&桌面软件C++不仅仅垄断了GUI 而且逻辑也几乎都是C++. 应用软件纯C++的,放眼过去几乎都是.你大可以说出一个个桌面软件,然后看看其开发语言. 游戏业务逻辑在服务端使用脚本有其特殊原因.但没人会拿lua实现服务器网络处理. 嵌入式 有高端和低端区别, 有的终端连个C标准库都放不进去.来10个c文件就报代码段溢出,& =.=|| 还谈什么C++, 但嵌入式不只是匮乏资源的平台, 也有平台资源相当丰富的大型设备的嵌入式. C++在其中负责逻辑. 3. 系统原语完全是C的份, 因为只需要支持到这一层.这完全和C++无关. 难道其它高级语言可以参与? C在这方面已经是垄断地位, 有不服C语言ABI的本地语言吗? no. 小样, 系统api还想不想调用了? 这是垄断地位,而不是因为优秀. 4. 模板拥有宏的好处, 但宏没有模板的强大功能. C中无数的宏说明 自动产生代码这种功能是有需求的. 泛型不只是泛型容器, 所以不是加参数那么简单. 如果说面向对象的继承做到拥有同样的接口就可以替换(动态多态), 那么模板就是更强的效果, 不必你真的有这个函数签名, 只需要你的写法能这样写,你就能替换(静态多态).很宏,但比宏强的多.
1. c: 工作机会,更多在非聚光灯下的. 这里我也不多说了.可能这里大多看到一些桌面软件和互联网公司. c的产业空间, 桌面,互联网是非常小的一块. 如果非要举例,我就说HW.
2: 关于大公司的规定. 核心产品,对库都有严格限制,如果要举例,我还以HW为例. 还有一些工业公司,比如nuclear,电力控制软件,.... MS在自己的整个产品线,都不用STL,MFC. 如果没有严格规定,达不到这样的质量控制. 至于更底层的,不说你也知道,基本上完全是C.只是因为产业链的原因,大多人接触得少.
3. 关于桌面. C++份额很小.至于待遇, 从HH拿到的资料,C++相比其他, 待遇属于偏低的,以及工业等 横向和纵向比较. 相比较C++这种复杂性,可以认为,C++对待遇有负面影响. 直白得说,就普遍状况,学习以及使用C++,对待遇的影响,基本上是负面的.互联网有些公司待遇可能不错,更多是盈利能力的问题. 这里仅做普遍比较.
4. 模板比宏更高级. 但是,通常,增加一个参数,连宏都不需要. 总之,C可以有更简洁的表达,仅此而已.
我在你所说的大公司。。带一个项目,做大型游戏,说几句
=============
boost是不用,因为太笨重,把代码搞得恶心
stl是肯定用的,久经考验,其带来的好处已经超过了坏处
另外,就我所知,做大型游戏,c++基本是必须的,c的表达力,写起逻辑来很费事,lua这些脚本是会用,但逻辑全靠它就扯淡了
=============
c++缺点太多了。。但是,还是很强大的,关键在于代码组织与控制
==============
我也有11年编码经验。。别扯什么破事,觉得不好用就别用,不必一杆子打倒一船人
另外,我也同意c++标准委员会是一群sb学究,就这样
===============
你说的以下两点纯扯淡,至少在我这个公司
===============
1. 大公司都严格限制可以使用的库. 可以很认真的告诉你, STL,Boost这种质量的库,大多时候都是被禁止使用的. 他们允许使用C++都在严格的限制下使用.
2. 桌面软件,游戏软件 C++主要就是做UI. 而UI部分,用C++开发的很少. 嵌入式,大多连C++的编译器都不支持. 除非是终端部分. 游戏逻辑,都有嵌入式语言支持.
--- 共有 4 条评论 ---
: JAVA就开发了一些安卓程序,就嘚瑟城这样,要是一开始不是安卓只支持JAVA,能有JAVA什么事,甚至因为JAVA让安卓背上卡顿的名头,甚至经常被苹果用户嘲笑,JAVA也就做做安卓小游戏,大游戏用JAVA,游戏行业会告诉你它的残酷性,JAVA也就能做做卡顿的安卓程序了
学究?GotW这种?嫌不够丢脸可以当面去喷Herb Sutter试试(人家应该没兴趣鸟)。不知道是不是这种坐井观天得太多了,我大天朝在isocpp.org里面居然都没存在感,就今年提过一个proposal……
不是第一个产品
等你吧产品release出来,再说扯淡不迟. 游戏行业的残酷性,会告诉你答案.
很奇怪,为什么要调试STL的?
--- 共有 1 条评论 ---
是谁说嵌入式不能用C++,说明嵌入式编译器对C++不兼容?eCos嵌入式操作系统是C++写的,这是怎么回事儿?我之前用MDK做一个STM32的嵌入式程序,就用C++写,挺好的。
立刻设为最佳答案
用STL只会浪费你的时间,让程序变得臃肿,难以调试. C++委员会根本不知道他们要干什么.
C++是一门没有人懂的语言,不管是设计,使用它的人,还是标准委员会.如果你必须用C++,就按照C的方式来使用.
所有系统级别的软件,都是建立在C之上.
--- 共有 3 条评论 ---
如果看过STL或者早期SGI代码,知道STL效率是很高的。
包括bootst。现在我在看的机器学习库caffe就大量用到boost代码。所以你觉得STL效率低是错误的。一个不会用开源库而去手鲁代码的程序员开发效率肯定很低,而且STL的代码大多是效率极高的实现方式。
不过滥用STL确实会导致代码臃肿和性能凭借,不过这不是程序员拒绝STL的理由。
如果你觉得臃肿,那说明你的思维模式还停留在C的模式。
STL会用到浪费时间,这啥智商。。。难道手撸动态数组和链表开发效率还高了不成。
分配器对于使用库的人来说是完全透明的,迭代器是必备的吧。。
假如不用STL,那你用什么呢?自己写字符串、链表这些早已被无数人分别实现了千百遍的基本数据结构?
我觉得string/wstring的实现的确是有值得商榷之处,当然,这也是C/C++的优点,编译器的实现复杂度大大降低了。
假如是用C++开发的,要我是肯定是用STL,省心省力。
如果程序结构复杂,我宁可用Lua + C也不用C++,C写底层接口,Lua编排上层逻辑
引用来自“mallon”的答案如果程序结构复杂,我宁可用Lua + C也不用C++,C写底层接口,Lua编排上层逻辑我会选择python,缺点就是尺寸大了点,不过,也比那个狗屁STL,boost要苗条.
--- 共有 2 条评论 ---
虽然我也在用C++,但是,如果一个项目太过于庞大,我也认为,C做基层,Lua做逻辑控制的效率更好。
STL到底有多大需要你们这么操心,反正我是没感觉到,从编码到编译到链接,没有觉得STL有那么狗屁
如果程序结构复杂,用lua来做逻辑,这是什么逻辑?
引用来自“宏哥”的答案
立刻设为最佳答案
用STL只会浪费你的时间,让程序变得臃肿,难以调试. C++委员会根本不知道他们要干什么.
C++是一门没有人懂的语言,不管是设计,使用它的人,还是标准委员会.如果你必须用C++,就按照C的方式来使用.
所有系统级别的软件,都是建立在C之上.
@宏哥 不用stl的话,难道真的自己写链表这些结构?正在被stl强j的人求解答。
我也觉得stl之流很恶心,但是又不得不用(不想自己写)。
boost倒是的确可以扔进垃圾桶了。
c++标准委员的脑袋都是被地铁门夹过的,新标准里面加的都是些没用的东西,真正有用的什么都没加。
--- 共有 1 条评论 ---
你真的了解boost吗。
boost很多功能都非常强大,只是一般程序员用不到。
反正我用着舒服就好,但凡喜欢批评的,大多也是半桶水。

我要回帖

 

随机推荐