STL中的矢量push_back
vector push_back in STL?
我找到了一个用于STL矢量的示例程序
#include <vector>
#include <iostream>
using namespace std;
/* This one may well work with some compilers/OS, and crash with
others. Who said the STL was safe ?? */
int main() {
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
for (vector<int>::iterator i = v.begin();
i != v.end(); i++) {
cout << *i << endl;
if (*i == 1) {
v.push_back(5);
}
}
}
我期待着结果:1 2 3 4 5
但是,结果非常奇怪-1 0 3 4 0 33 0 0 0 0 00 0 0 0 49 0 1 2 3 4 5 5
我猜,这有一些逻辑,我遗漏了,因为这些看起来不像垃圾值,因为结果总是一样的。执行push_back后,迭代器是否被重置?我在某个地方读到,在迭代向量的同时附加到向量上不是一个好主意。我的问题是为什么?
经过一些互联网搜索,
if (*i == 1) {
size_t diff = i-v.begin();
v.push_back(5);
i = v.begin()+diff;
}
这将解决问题。
您正在修改std::vector
,同时对其进行循环。当调用std::vector::push_back()
时,如果其当前size()
等于其当前capacity()
,则std::vector
必须重新分配其内部数据存储以增加其容量,然后才能存储新值。这种重新分配将使循环iterator
无效(end()
迭代器总是无效的,但您在每次迭代中都会重新评估它,所以在这种情况下是可以的)。
要执行您正在尝试的操作,请执行以下任一操作:
-
reserve()
在进入循环之前vector
的容量,以避免重新分配,从而避免使循环iterator
无效。 -
每次重新分配后重置迭代器。
-
使用
std::list
,因为循环iterator
不会被std::list::push_back()
无效。
因为std::vector::push_back
可能会使所有迭代器无效。
如果新的size()大于capacity(),则所有迭代器和引用(包括过去的结束迭代器)都将无效。
对于您的代码,可以使用std::vector::reserve
来避免重新分配。
将容器的容量增加到大于或等于new_cap的值。
int main() {
vector<int> v;
v.reserve(5); // ensure no reallocation until size() == 5
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
for (vector<int>::iterator i = v.begin();
i != v.end(); i++) {
cout << *i << endl;
if (*i == 1) {
v.push_back(5);
}
}
}
正如你所说,在迭代向量的同时附加到向量上不是一个好主意。
现有答案中有一些不错的选项,但值得一提的是,当您知道由于push_back大小超出容量而面临潜在的迭代器无效时,另一个经常被遗忘的选项是:
for (size_t i = 0; i < v.size(); ++i) {
cout << v[i] << endl;
if (v[i] == 1)
v.push_back(5);
}
它是"C风格",但简单直观。
- 推导 std::vector::back() 的返回类型
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- vector.push_back(vector.back()+1) 是未定义的行为吗?
- C++自己的对象堆栈.在 push() 上复制了什么?
- C++ push() 和 pop() 方法使用指针的动态 LinkedList 的问题
- 如何像在javascript中一样"push" c ++映射
- 线路抑制状态错误 C4703 可能未初始化的局部指针变量"back"已使用
- std::vector using back(), pop_back(), push_back(), 得到'double free or corruption'错误
- vector.back()和vector.end()有什么区别
- 列表大小为 1,但 front() 和 back() 不相等
- 返回C++中没有 back() 方法的容器的最后一个元素?
- 在非空 std::list 上使用 std::list.back<int>() 时"Segmentation Fault"
- 模板堆栈类的复制构造函数中的 pop() 和 push() 不起作用
- 我们可以使用Back() - 值索引在其上执行向量插入
- 当我运行以下代码添加str.front() str.back时,它给了我200个,但为什么
- push(ing)back在循环中对象指针
- 在 C++ 中将元素添加到空向量:为什么 push.back 有效而 [] 无效
- 我似乎无法让 v.push.back() 处理字符串
- String::push_back() does not push back
- 向量resize(), push.back(), reserve()方法