Effective STL学习总结一

本文总结了EffectiveSTL中的五个关键建议,包括如何选择合适的容器类型、避免编写依赖容器类型的代码、确保容器对象拷贝的正确性和效率、正确使用empty而非size方法,以及优先采用区间成员函数进行操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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<int> vstr;

typedef vector<int>::iterator vstriterator;

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

 

书中还建议自己封装

class CustomVector

{

private:

         typedef vector<Custom> CustomerContainer;

         typedef vector<Custom>::iterator CCIterator;

 

         CustomerContainer customers;

 

public:

         ...

};

 

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

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

创建对象数组:

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

         vector<Widget> 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<int>(cout,"/n") );

erase

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

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

 

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

         vector<int>::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)     它们表现出一更高的效率(如插入,一次过预留要插入的空间数,而不会每插入一次改变一次)

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值