Effective STL学习总结一

Effective STL学习总结一(1-5

kejieleung

1条:慎重选择容器类型

标准STL序列容器:vector, string, deque list

标准STL关联容器:set, multiset, map, multimap

非标准STL关联容器:hash_set, hash_multiset, hash_map, hash_multimap

   选择的要点无非是实际应用中具体要求:是否要有序?是否需要经常加入,删除?随机访问等。

 

2条:不要试图编写独立于容器类型的代码

         虽然不同容器有类似的操作,如push_back, insert等,但不同的容器会有很多细节上的不同处理,所以最好不要以一种统一的方法使用vectorlist之类。如果要从vector转到使用list, 也要认真检查每步相关的操作

 

可以使用typedef来分离

typedef vector vstr;

typedef vector::iterator vstriterator;

不仅使用时可以少打代码,切换也方便!

 

书中还建议自己封装

class CustomVector

{

private:

         typedef vector CustomerContainer;

         typedef vector::iterator CCIterator;

 

         CustomerContainer customers;

 

public:

         ...

};

 

3条:确保容器中的对象拷贝正确而高效

         Stl做了很多的拷贝,但它总的设计思想是为了避免不必要的拷贝。事实上它的总体设计目标是为了避免创建不必要的对象。

创建对象数组:

         Widget w[ max_num ]; //一次过创建这么多个对象

         vector vw; //创建了0个,需要时会增长

 

4条:调用empty而不是检查size()是否为0

通常会认为:

         If( c.size() == 0 )

         If( c.empty ) 相同

但是,empty是对于所有标准容器来说是常数时间的,而size() list的实现中可能线时间的!

5条:区间成员函数优先于与之对应的单元素成员函数

相关操作函数

assign

         v1.assign(v2.begin() + v2.begin()/2, v2.end() );

insert

         v1.insert( v1.end(),v2.begin() + v2.begin()/2, v2.end() );

copy

         copy( name.begin(), name.end(), ostream_iterator(cout,"/n") );

erase

         iterator container::earse( iterator begin, iterator end );  //序列容器

         void container::earse( iterator begin, iterator end );     //关联容器

 

显式写循环效率低下,而且很我不必要的构造函数调用,数据拷贝,移动:

         vector::iterator insertLoc( v.begin() );

         for( int i=0; i< numValues; ++i )

         {

                  insertLoc = v.insert( insertLoc, data[i] );

             ++insertLoc; //即使每次都是从最后插入,效率上仍然比不上区间insert(当超出长度时有移动多次,区间insert只移动一次。

         }

改成使用区间insert:

         name.insert( name.begin(), data + 1, data + MAX_LEN - 1); //会更高效(快一倍)

 

这样做的好处有:

(1)     区间成员函数写起来更方便(不用显式写循环)

(2)     更能清楚的表达你的意图

(3)     它们表现出一更高的效率(如插入,一次过预留要插入的空间数,而不会每插入一次改变一次)

 

测试代码如下,相差非常大!!

#include #include #include #include #include #include using namespace std; typedef vector vstr; typedef vector::iterator vstriterator; #define MAX_LEN 100000 int main() { long start; int randseed; int i; int * data = new int[ MAX_LEN ]; vstr name; srand(time(NULL)); randseed = rand(); for( i=1; i(cout,"/n") ); cout<

你可能感兴趣的:(C/C++)