发布时间:2011-5-31 11:35
分类名称:STL
[vector]
性能:
末端插入删除效率高,中间效率低。
要求:
assignable && copyable
注意:
保留内存的方法:
混淆:
size(), max_size(), capacity()
例子代码:
vector<int> nTest(10, 0);
nTest.reserve(20);
cout << "size() " << nTest.size() << endl;
cout << "max_size() " << nTest.max_size() << endl;
cout << "capacity() " << nTest.capacity() << endl;
输出
size() 10 (当前实际存储的元素数量)
max_size() 1073741823 (vector能存储的最大元素数量)
capacity() 20 (vector在重新分配空间之前,能容纳的最大数量)
reverse(), resize()
错误代码:
vector<char> myVec;
myVec.reserve(100);
char szTest[] = "how do you do";
memcpy(&myVec[0], szTest, sizeof(szTest));
编译没有问题,运行的时候,可能你的运气比较好,不会崩溃;可能你的运气差,一运行就崩溃了。
原因:
vector 的reverse只是增加了vector的capacity,但是size没有改变! resize同时改变了vector的capacity和size!
reserve是容器预留空间,但并不真正创建元素对象,在创建对象之前,不能引用容器内的元素,因此当加入新的元素时,需要用push_back()/insert()函数。
resize是改变容器的大小,并且创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。
[Deque]
性能:
两端插入删除效率高,中间效率低。
要求:
assignable && copyable
注意:
区别(vector):
deque不提供capacity和reserve支持。
deque多了push_front和pop_front支持。
[List]
性能:
不支持随机存取(所以不知道at(), []),在list遍历元素很缓慢。在任何位置安插和移除的速度都很快。
要求:
assignable && copyable
注意:
[Sets & Multisets]
性能:更具特定的排序准则,自动将元素排序。(Multisets运行重复排序)。内部建立二叉树,使得搜索性能很高。
要求:
assignable && copyable && comparable
注意:
if x < y is true, then y < x is false.
if x < y is true and y < z is true , then x < z is true.
x < x is false forever.
[Maps & Multimaps]
性能:和Sets multisets一样,只不过maps中的元素成了一个pair,而不是一个value。
要求:
value :assignable &©able
key :comparable