Effective STL 建议

来源:互联网 发布:淘宝挂机赚钱软件 编辑:程序博客网 时间:2024/05/14 07:40

Vector是一种可以默认使用的序列类型,当很频繁地对序列中部进行插入和删除时应该用lit,当大部分插入和删除发生在序列的头或尾时可以选择deque这种数据结构。

         STL是建立在泛化上的。数组泛化了容器,参数化了所包含的对象的类型。函数泛化为算法,参数化了所有的迭代器的类型。指针泛化为迭代器,参数化了所指向的对象的类型。

         独立的容器类型泛化为序列或关联容器,而且类似的容器拥有类似的功能。标准的内存相邻容器都提供随机访问迭代器,标准的基于节点的容器都提供双向迭代器。序列容器支持Push_front或者push_back,但关联容器不支持。关联容器提供对数时间复杂度的lower_bound、upper_bount和equal_range成员函数,但序列容器却没有。

         在一个序列容器上用一个迭代器作为参数调用erase,会返回一个新的迭代器,但在关联容器上什么都不返回。

        

对于使用empty和size来判断容器的大小时,尽可能使用empty,因为empty是一个常数时间的操作,但对于一些list实现,size花费线性时间。为什么list这么麻烦,为何不提供一个常数时间的size?对于list特有的splice有很多要处理的东西。

List<int> list1;

List<int> list2;

List1.splice(list1.end(),list2,find(list2.begin(),list2.end(),5),find(list2.rbegin(),list2.rend(),10.base()));

把List2中从第一次出现5到最后一次出现10的所有节点移要list1的结尾。如果用empty来代替检查是否size()==0,不会出错,在想知道容器是够包含0个元素的时候都应该调用empty().

 

         区间成员函数assign,他对于所有标志序列容器(vector、string、deque和List)都有效。无论何时你必须完全代替一个容器的内容,你就应该想到赋值。如果你只是拷贝一个容器到另一个同类型的容器,operator=就是选择的赋值函数,当你想要给一个容器完全的新数据集时,assign就可以利用。很多人使用copy,其实所有的目标区间被插入迭代器指定的copy的使用都可以用调用的区间成员函数来替代。使用区间成员函数代替单元素兄弟元素的操作,区间构造函数:所有标准容器都提供了这种形式的构造函数

Container::container(InputIteratorbegin,InputIterator end);

区间插入函数:所有标准序列容器都提供这种形式的insert:

Void container::insert(iteratorposition,InputIterator begin,InputIterator end);

区间删除,序列和关联容器的返回类型不用,一个返回为被删除元素的下一个元素,一个返回void。标准容器提供了iterator container:erase(iterator begin,iterator end);

关联容器提供这个:void container::erase(iterator begin,iterator end);

区间赋值:

Void container::assign(InputIteratorbegin,InputIterator end);

 

通过没有虚析构函数的基类指针来删除派生对象的行为是未定义的,进程没有需析构函数的类也是很有风险的。

 

不要建立auto_ptr的容器.因为当你拷贝一个auto_ptr时,auto_ptr所指向对象的所有权被转移到拷贝的auto_ptr,而被拷贝的auto_ptr被设为NULL。也就是auto_ptr有唯一的拥有权。

 

         STL中的线程安全,从STL实现中可以确定的是:

         多个读取者是安全的。多线程可能同时读取一个容器的内容,这将正确地执行。在读取时不能有任何写入者操作这个容器。

         对不同容器的多个写入者是安全的。多线程可以同时写入不同的容器。

 

         Vector和string可以管理好自己的内存。当元素添加到那些容器中时他们的内存会增长,而且当一个vector或string销毁时,它的析构函数会自动销毁容器中的元素,回收存放那些元素的内存。

2 0
原创粉丝点击