C++标准程序库细节整理(三)第六章

来源:互联网 发布:网络大电影投资合同 编辑:程序博客网 时间:2024/05/21 20:29

1、STL容器的三大核心能力是:(1)所有容器提供的都是“value语意”而非“reference语意”;(2)总体而言,所有元素形成一个次序;(3)一般而言,各项操作并非绝对安全。

2、STL容器类别的共同操作:(见C++标准程序库的第145页)。

3、vector的大小操作:size();capacity();reserve()。vector的操作:构造、拷贝和解构;非变动性操作;赋值操作;元素存取操作。

reserve()从新分配的大小必须大于容器原分配的大小,否则不会起作用。既然vector的容器不会缩减,即使删除元素,其reference、pointers、iterators也会继续有效,继续指向动作发生前的位置。然而安插操作可能使reference、pointers、iterators失效。赋值操作有:assign(n,elem);assign(beg,end);c1.swap(c2);swap(c1,c2)。元素存取操作有:c.at(idx);c[idx];c.front();c.back()。注意:存取操作只有at检查元素是否存在,其他三个不做检查。

4、千万不要把迭代器当做第一元素的地址来传递。vector迭代器是由实作版本定义的,也许并不是一个一般指针。

5、关于vector的一些异常处理:

(1)如果push_back()安插元素时发生异常,该函数不起作用。

(2)如果元素的拷贝操作不抛出异常,那么insert()要么成功,要么不生效用。

(3)pop_back()决不会抛出任何异常。

(4)如果元素拷贝操作不会抛出异常,erase()和clear()就不抛出异常。

(5)swap()不抛出异常。

(6)如果元素拷贝操作绝对不会抛出异常,那么所有操作不是成功,就是不起作用。这类元素可被称为POD。POD泛指那些无C++特性的型别,例如C structure便是。

6、只有在non-const vector<bool>容器中才会用到内部型别reference。取存元素用const member function 会返回型别为bool的普通数值。

7、deques的操作:deques的构造函数和析构函数;deques的非变动性操作;deques的变动性操作。

deques不提供容器操作(capacity()和reserve())。deques直接提供函数,用以完成头部元素的安插和删除。

同vector一样,除了at()外,没有任何成员函数会检查索引或迭代器是否有效。同vector一样,deques的任何插入和删除操作都会使所有指向deques元素的pointers、reference失效,除了特殊情况(头部和尾部)。

8、Lists提供了不少特殊的成员函数,专门用于移动元素。较之同名的STL通用算法,这些函数执行起来更快,因为它们无需拷贝或移动,只需调整若干指针即可。

9、Lists的特殊函数sort()、remove()、remove_if()。另外,Lists还有一些特殊的变动性操作:c.unique();c.unique(op);c1.splice(pos,c2);c1.splice(pos,c2,c2pos);c1.splice(pos,c2beg,c2end);c.sort();c.sort(op);c1.merge(c2);c1.merge(c2,op);c.reverse()。

10、set和multiset有一个重要限制:你不能直接改变元素值,因为这样会打乱原本正确的顺序。因此,要改变元素的值,必须先删除旧元素,再插入新元素。sets、mutisets不提供用来直接存取元素的任何操作函数。通过迭代器进行元素间接存取,有一个限制:从迭代器的角度来看,元素值是常数。

11、set和multiset的特殊搜寻函数:count(elem);find(elem);lower_bound(elem);upper_bound(elem);equal_range(elem)。

12、map、multimap有一条重要的限制:你不可以直接改变元素的key,实际上key是一个const常量。map、multimap的特殊搜寻操作函数同set和setmultiset的。如果要移除map和multimap的元素,你只能使用它们所提供的成员函数。

13、non-const maps提供下表操作符,支持元素的直接存取:m[key]。优点:你可以透过更方便的结构对着map安插新元素。缺点是你可能不小心误置了新元素。如:std::cout<<coll["ottto"]。

0 0
原创粉丝点击