随笔 - 576  文章 - 0  评论 - 62  阅读 - 219万

随笔分类 -  Effective STL

【S6】当心C++编译器最烦人的分析机制
摘要:1、考虑一个包含int的文件,复制到list,如下: ifstream dataFile("ints.bat"); list data(istream_iterator(dataFile),istream_iterator());2、上面的代码不是预期的行为。3、先从最简单开始,声明方法 int f... 阅读全文
posted @ 2015-07-12 19:38 Andy Niu 阅读(461) 评论(0) 推荐(0) 编辑
【S16】了解如何把vector和string数据传给旧的API
摘要:1、尽量使用vector和string替换数组,但是老的代码还是使用数组。如果老的接口期望是数组,怎么办? 需要把vector和string,暴露出数组接口,也就是第一个元素的地址。2、考虑方法DoSomething(const int* pInt,size_t size),对于vector vec,调用如下: DoSomething(&vec[0], v.size()); 这里有个问题,vec的大小可能为0,更安全的做法是: if(!vec.empty()) { DoSomething(&vec[0], v.size()); }3、考虑,能不能使用begin... 阅读全文
posted @ 2014-04-10 19:22 Andy Niu 阅读(731) 评论(0) 推荐(0) 编辑
【S17】使用“swap技巧”除去多余的容量
摘要:1、考虑下面的需求,对于vec开始的时候有1000个元素,后来只有10个元素,那么vec的capacity至少还是1000,后面的990个内存单元,没有使用,但是还被vec霸占着。如何释放这些内存呢?2、我们知道,vector进行copy构造的时候,根据rhs 的size进行分配内存。因此,我们可以建立一个临时对象,然后交换一下就可以了。如下: vector(vec).swap(vec); vector(vec) 是个临时对象,可认为capacity为10,而vec的capacity为1000,二者交换后,vec的capacity为10,临时对象析构。3、这里需要注意两点: a、临时对象... 阅读全文
posted @ 2014-03-10 12:13 Andy Niu 阅读(488) 评论(0) 推荐(0) 编辑
【S13】vector和string优先于动态分配的内存
摘要:1、使用new动态分配内存,必须承担如下责任: a、使用delete释放内存; b、确保使用了正确的形式,delete与new的形式要匹配; c、不能重复delete。2、使用vector和string可以消除以上的负担。每当要动态分配一个数组时,都要考虑使用vector和string替代。如果元素是字符char,使用string。否则使用vector。注意:有一种特殊情况,使用vector更合理。3、vector和string的元素分配在堆上,它们内部维护一个指针,指向堆上的元素。vector和string是深拷贝,会把元素逐个拷贝。4、vector和string,它们自己管理内... 阅读全文
posted @ 2014-01-12 22:33 Andy Niu 阅读(479) 评论(0) 推荐(0) 编辑
【S4】使用empty()而不是判断size()是否为0
摘要:1、二者的作用是一样的,结果也是等价的。就是判断集合是否为空。2、二者是等价的,为什么强调使用empty,因为empty效率更高。3、在STL中,对于一般的集合,empty和size都是常数时间。但是对于list,empty是常数时间,size是线性时间;考虑为什么? 考虑增删操作,对于一般的集合,增删是线性时间,因为涉及到元素的移动,增删的同时也就更新了元素个数。但是对list增删,是常数时间,不会更新节点个数。 因此,对于一般的集合,size是实时更新的,empty与size可认为是等价的。但是对于list:对于empty,只需要检查head是否为end就可以了,为常数时间。对于siz.. 阅读全文
posted @ 2013-11-06 20:42 Andy Niu 阅读(541) 评论(0) 推荐(0) 编辑

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示