使用vector需要注意的要点
2012-12-08 21:32
197 查看
[align=center][/align]
vector的元素类别T,必须具备assignable和copyable两个性质。
[align=center][/align]
vector的容量很重要:
1. 一旦内存重新配置,和vector元素相关的所有references、pointers、iterators都会失效。
2. 内存重新分配很耗时间。
所以,如果程序管理了和vector元素相关的references、pointers、iterators或执行速度至关重要,就必须考虑容量问题。
可以使用reserve()保留适当容量,避免一再重新分配内存。
[align=center][/align]
可以利用如下语句缩减容量:
std::vector<T>(v).swap(v);
[align=center][/align]
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):同上。此为全局函数
上面列出的全部是“将新元素赋值给vectors,并将旧元素全部移除”的方法。
[align=center][/align]
operator[]、front()、back(),不做范围检查,如果发生越界错误,会引发未定义行为。所以使用时,必须确定索引有效。
std::vector<Elem> coll;
if (coll.size() > 5) {
coll[5] = elem;
}
if (!coll.empty()) {
cout << coll.front();
}
[align=center][/align]
vector迭代器持续有效,除非发生两种情况:(1)在一个较小索引位置上安插或移除元素;(2)由于容量变化而引起内存重新分配。
[align=center][/align]
移除“与某值相等”的所有元素:
std::vector<Elem> coll;
…
// remove all elements with value val
coll.erase(remove(coll.begin(), coll.end(), val), coll.end());
[align=center][/align]
只移除“与某值相等”的第一个元素:
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);
}
[align=center][/align]
vector元素分布于连续空间中,所以有:&v[i] == &v[0] + i
[align=center][/align]
千万不要把迭代器当做元素地址来传递,vector迭代器由实作版本定义,也许并不是一般指针。
printf(“%s\n”, v.begin()); // ERROR (might work, but not portable)
[align=center][/align]
如果需要静态大小的bitfield,应当使用bitset,而不是vector<bool>。
[align=center][/align]
vector的元素类别T,必须具备assignable和copyable两个性质。
[align=center][/align]
vector的容量很重要:
1. 一旦内存重新配置,和vector元素相关的所有references、pointers、iterators都会失效。
2. 内存重新分配很耗时间。
所以,如果程序管理了和vector元素相关的references、pointers、iterators或执行速度至关重要,就必须考虑容量问题。
可以使用reserve()保留适当容量,避免一再重新分配内存。
[align=center][/align]
可以利用如下语句缩减容量:
std::vector<T>(v).swap(v);
[align=center][/align]
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):同上。此为全局函数
上面列出的全部是“将新元素赋值给vectors,并将旧元素全部移除”的方法。
[align=center][/align]
operator[]、front()、back(),不做范围检查,如果发生越界错误,会引发未定义行为。所以使用时,必须确定索引有效。
std::vector<Elem> coll;
if (coll.size() > 5) {
coll[5] = elem;
}
if (!coll.empty()) {
cout << coll.front();
}
[align=center][/align]
vector迭代器持续有效,除非发生两种情况:(1)在一个较小索引位置上安插或移除元素;(2)由于容量变化而引起内存重新分配。
[align=center][/align]
移除“与某值相等”的所有元素:
std::vector<Elem> coll;
…
// remove all elements with value val
coll.erase(remove(coll.begin(), coll.end(), val), coll.end());
[align=center][/align]
只移除“与某值相等”的第一个元素:
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);
}
[align=center][/align]
vector元素分布于连续空间中,所以有:&v[i] == &v[0] + i
[align=center][/align]
千万不要把迭代器当做元素地址来传递,vector迭代器由实作版本定义,也许并不是一般指针。
printf(“%s\n”, v.begin()); // ERROR (might work, but not portable)
[align=center][/align]
如果需要静态大小的bitfield,应当使用bitset,而不是vector<bool>。
[align=center][/align]
相关文章推荐
- 使用Django时需要注意的八个要点
- 使用标准模板库中的vector时需要注意的地方
- solr使用时需要注意的要点针对solr的schma.xml文件
- [置顶] java Vector 在多线程使用中需要注意的问题
- vector使用需要注意的一些问题
- MyBatis排序时使用order by 动态参数时需要注意,用$而不是#, #{}和${}的区别以及order by注入问题
- 使用消息队列需要注意的几个关键问题
- 17.11.15 centerloss使用的时候需要注意的一些点
- 做移动应用使用地图API时需要注意的问题
- Hibernate使用二级缓存时,createSQLQuery需要注意的问题
- 使用foreach需要注意的一点
- IE8、IE7、IE6中使用getElementById需要注意的问题
- 关于在使用parseInt进行日期判断需要注意的地方
- 使用接插件需要注意的问题
- vue+elementUI中使用 el-autocomplete 实现远程搜索的下拉框需要注意的问题
- 使用DB2中需要注意的一个问题。
- RPC 使用中的需要注意的地方
- 使用maven打包时需要注意的问题
- 在CI中的控制器需要使用构造函数时注意
- 【Ojdbc】使用Ojdbc 时需要注意的问题