Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ STL中的矢量推回?_C++_Vector_Stl - Fatal编程技术网

C++ 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

我找到了一个样本程序,我尝试了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);
    }
  }
}

这将解决问题。

您正在修改
std::vector
,同时对其进行循环。调用
std::vector::push_back()
时,如果其当前
size()
等于当前
capacity()
,则
std::vector
必须重新分配其内部数据存储以增加其容量,然后才能存储新值。这种重新分配将使循环
迭代器
(迭代器总是无效的
end()
,但是每次迭代都要重新计算它,所以在这种情况下是可以的)

要执行您正在尝试的操作,请执行以下任一操作:

  • reserve()

  • 在每次重新分配后重置迭代器

  • 请改用
    std::list
    ,因为循环
    迭代器不会因
    std::list::push_back()
    而失效

  • 因为可能会使所有迭代器无效

    如果新的size()大于capacity(),则所有迭代器和引用(包括结束迭代器的过去部分)都将无效

    对于代码,可以使用以避免重新分配

    将容器的容量增加到大于或等于新容量的值

    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;icout关键字:迭代器无效。关于您的解决方法,请看一看,而不是使用
    -
    +
    运算符。好的。这将是纯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);
    }