vector要注意的点
vector的元素类别T,必须具备assignable和copyable两个性质。
vector的容量很重要:
1. 一旦内存重新配置,和vector元素相关的所有references、pointers、iterators都会失效。
2. 内存重新分配很耗时间。
所以,如果程序管理了和vector元素相关的references、pointers、iterators或执行速度至关重要,就必须考虑容量问题。
可以使用reserve()保留适当容量,避免一再重新分配内存。
可以利用如下语句缩减容量:
std::vector<T>(v).swap(v);
注意,上面前面括号里的v不能缺少。
作用相当于:
作用相当于:
{
std::vector<T> temp(X);
temp.swap(X);
}
然后临时对象会被释放。
注意vector的clear方式是清空所有元素。而因为vector的空间是只增不减,所以要压缩空间,就需要用到上面的方法。
c1 = c2:将c2的全部元素赋值给c1
c.assign(n, elem):复制n个elem,赋值给c
c.assign(beg, end):将区间[beg;end]内的元素赋值给c
c1.swap(c2):将c1和c2元素互换
swap(c1, c2):同上。此为全局函数
operator[]、front()、back(),不做范围检查,如果发生越界错误,会引发未定义行为。所以使用时,必须确定索引有效。
std::vector<Elem> coll;
if (coll.size() > 5) {
coll[5] = elem;
}
if (!coll.empty()) {
cout << coll.front();
}
vector迭代器持续有效,除非发生两种情况:(1)在一个较小索引位置上安插或移除元素;(2)由于容量变化而引起内存重新分配。
移除“与某值相等”的所有元素:
std::vector<Elem> coll;
…
// remove all elements with value val
coll.erase(remove(coll.begin(), coll.end(), val), coll.end());
注意:remove是不删除元素的。
只移除“与某值相等”的第一个元素:
std::vector<Elem> coll;
…
// remove first element with value val
std::vector<Elem>::iterator pos;
pos = find(coll.begin(), coll.end(), val);
if (pos != coll.end()) {
coll.erase(pos);
}
vector元素分布于连续空间中,所以有:&v[i] == &v[0] + i
千万不要把迭代器当做元素地址来传递,vector迭代器由实作版本定义,也许并不是一般指针。
printf(“%s\n”, v.begin()); // ERROR (might work, but not portable)
如果需要静态大小的bitfield,应当使用bitset,而不是vector<bool>。