C++ STL中的矢量推回?
我找到了一个样本程序,我尝试了STL向量C++ STL中的矢量推回?,c++,vector,stl,C++,Vector,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_ba
#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);
}
}
}
这将解决问题。您正在修改
std::vector
,同时对其进行循环。调用std::vector::push_back()
时,如果其当前size()
等于当前capacity()
,则std::vector
必须重新分配其内部数据存储以增加其容量,然后才能存储新值。这种重新分配将使循环迭代器
(迭代器总是无效的end()
,但是每次迭代都要重新计算它,所以在这种情况下是可以的)
要执行您正在尝试的操作,请执行以下任一操作:
reserve()
std::list
,因为循环迭代器不会因std::list::push_back()
而失效
intmain(){
向量v;
v、 保留(5);//确保在size()=5之前不重新分配
v、 推回(1);
v、 推回(2);
v、 推回(3);
v、 推回(4);
for(vector::iterator i=v.begin();
i!=v.end();i++){
cout现有答案中有一些不错的选项,但值得一提的是,当您知道由于向后调整大小超出容量而面临迭代器失效的可能性时,另一个经常被遗忘的选项:
for (size_t i = 0; i < v.size(); ++i) {
cout << v[i] << endl;
if (v[i] == 1)
v.push_back(5);
}
for(size_t i=0;i cout关键字:迭代器无效。关于您的解决方法,请看一看,而不是使用-
和+
运算符。好的。这将是纯STL解决方案。通过一个问题,我已经解决了很多问题。谢谢。STL是一个非常深的海洋。reserve似乎是一个很好的方法,可以节省一些临时变量ng.@Vishwadeep:不要将reserve()
与resize()
混淆,它们只分配向量的内部内存并设置向量的容量()
,但不影响向量的大小()
,因此仍然需要临时变量和推回()
等等。如果使用resize())
相反,这会影响size()
,那么您可以避免推回()
并直接使用指向向量的指针/引用。
是的,你是正确的。不管怎样,我会用拇指法则,在迭代向量时附加到向量不是一个好主意。否则就处理这种情况。哦,好的。这意味着当容量增加时它将失效,这是我在6-7项之后应该做的,然后我就不会了我没有面对这个问题。这给了我一个更好的画面。谢谢
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);
}
}
}
for (size_t i = 0; i < v.size(); ++i) {
cout << v[i] << endl;
if (v[i] == 1)
v.push_back(5);
}