1. erase() 成员函数的两个重载
c.erase(pos):移除 iterator 位置 pos 上的元素,返回下一个元素的位置;
c.erase(beg, end):移除 [beg, end) 区间内的所有元素,返回下一个元素的位置;
2. resize()
std::vector<int> v;
v.resize(3);
// v[0] = 0
// v[1] = 0
// v[2] = 0
3. 大小(size)和容量(capacity)
注意区分这两个概念,因为这两个是差异非常大的概念,两者对 vector 的效率也有着至关重要的影响。(两者返回的是元素数量,而非容器所占字节数)
使 vector 达到优异效率的秘诀之一,就是分配出“较其容纳的元素”更多的内存。为了高效地运用 vector,你应该了解大小(size)和容量(capacity)之间的关系和区别。
vector 提供的用以操作大小的函数有 size()
、empty()
和 max_size()
(32位机器v.max_size()
的大小一般为1073741823,
230−1
)。另一个与大小有关的函数是 capacity(),返回 vector 实际能够容纳的元素量。如果超过这个数量,vector 就有必要重新分配内存。
vector 的容量之所以如此重要(也即内存重新分配的弊端),有两个原因:
一旦内存重新分配,vector 元素相关的所有 reference、pointer、iterator都会失效
内存重新分配十分耗时。
故,如果你的程序管理了“与vector元素相关”的reference、pointer 或 iterator,或如果程序的执行速度对你而言至关重要,那就必须考虑容量问题。
两种避免重新分配内存的方法
我们可以使用 reverse() 保留适当容量,避免重新分配内存。如此以来,只要保留的容量尚有富余,就不必担心 reference 失效。
std::vector<int> v; v.reserve(80); std::cout << v.size() << std::endl; // 0 std::cout << v.capacity() << std::endl; // 80 std::cout << v.max_size() << std::endl; // 1073741823
初始化期间就像构造函数传递额外实参,构造足够的空间。如果你的实参是个数值,它将成为 vector的起始大小。
std::vector<T> v(3); // creates a vector and initializes it with five values // (calls five times the default constructor of type T)
class Dog { public: Dog() { std::cout << "wang ! wang wang !!" << std::endl; } }; int main(int, char**) { std::vector<Dog> ds(3); // wang ! wang wang!! // wang ! wang wang!! // wang ! wang wang!! std::cout << ds.size() << std::endl; // 3 return 0; }
欲获得这种能力,元素类型必须提供一个 default 构造函数。对基础类型而言,唯一能保证的是 zero initialization。