仅仅是个选择的问题,都是STL,可能写出来的效率相差几倍;
熟悉如下条款,高效的使用STL;算法
STL基于拷贝的方式的来工做,任何须要放入STL中的元素,都会被复制;
这也好理解,STL工做的容器是在堆内开辟的一块新空间,而咱们本身的变量通常存放在函数栈或另外一块堆空间中;为了可以彻底控制STL本身的元素,为了能在本身的地盘随心干活;这就涉及到复制;
而若是复制的对象很大,由复制带来的性能代价也不小 ;
对于大对象的操做,使用指针来代替对象能消除这方面的代价;编程
只涉及到指针拷贝操做, 没有额外类的构造函数和赋值构造函数的调用;函数
vecttor <BigObj> vt1; vt1.push_bach(myBigObj); vecttor <BigObj* > vt2; vt2.push_bach(new BigObj());
注意事项:工具
由于对于list,size()会遍历每个元素来肯定大小,时间复杂度 o(n),线性时间;而empty老是保证常数时间;性能
使用区间成员函数有如下好处:指针
例:将v2后半部的元素赋值给v1:code
单元式操做:server
for (vector<Widget>::const_iterator ci = v2.begin() + v2.size() / 2; ci != v2.end(); ++ci) v1.push_back(*ci)
使用区间成员函数assign():对象
v1.assign(v2.begin() + v2.size() / 2, v2.end());
新增元素空间不够时,vector会进行以下操做:blog
若是预先知道空间的大小,预先分配了空间避免了从新分配空间和复制的代价;
注:reserve()只是修改了容量,并不是大小,向vector中增长元素仍是须要经过push_back加入;
对阶段性操做的定义:
先作一系列插入、完成以后,后续操做都是查询;
在阶段性的操做下,使用vector有如下优点:
插入时,insert效率高;由于operator会先探查是否存在这个元素,若是不存在就构造一个临时的,而后才涉及到赋值,多了一个临时对象的构造;
更新时,[]效率更高,insert会创造一个对象,而后覆盖一个原有对象;而[]是在原有的对象上直接赋值操做;
散列函数的默认比较函数是equal_to,由于不须要保持有序;
由于内联,在函数对象的方式中,内联有效,而做为函数指针时,通常编译器都不会内联函数指针指向的函数;即便指定了inline;
好比:
inline bool doubleGreater(double d1, double d2) { return dl > d2; } vector<double> v; ... sort(v.begin(), v.end(), doubleGreater);
这个调用不是真的把doubleGreater传给sort,它传了一个doubleGreater的指针。
更好的方式是使用函数对象:
sort(v.begin(), v.end(), greater<double>())
注:《effcient c++》中的实验结论,使用函数对象通常是裸函数的1.5倍,最多能快2倍多
须要排序前思考咱们的必要需求,可能咱们只是须要前多少个元素,这时并不须要使用sort这种线性时间的工具,性能消耗更少的parttition多是更好的选择;
如下算法的效率从左到右依次递减:
partition > stable_partition / nth_element / patical_sort / sort / stable_sort
功能说明:
为何vector不提供push_front()成员方法?由于效率太差,若是有太多从前面插入的需求,就不该该使用vector,而用list;
关心查找速度,首先应该考虑散列容器(非标准STL容器,如:unordered_map,unordered_set);其次是排序的vector,而后是标准的关联容器;
《effictive STL》
《Efficient C++》
若是你以为本文对你有所帮助,请点击如下【推荐】按钮, 让更多人阅读;
Posted by: 大CC | 25JUN,2015
博客:blog.me115.com [订阅]
微博:新浪微博