C++ 调整向量大小后,为什么我不能增加向量

C++ 调整向量大小后,为什么我不能增加向量,c++,vector,C++,Vector,我正在尝试编写一个数据结构,我可以循环使用,类似于循环列表,使用向量。我认为应该用十个元素初始化底层数组。我不明白为什么我不能推进迭代器。有人能帮忙吗 我不能使用push_back(),因为它总是附加到我不想要的结尾 // re-use start of vector when get to end #include <vector> #include <iostream> #include <algorithm> using std::cout; usin

我正在尝试编写一个数据结构,我可以循环使用,类似于循环列表,使用向量。我认为应该用十个元素初始化底层数组。我不明白为什么我不能推进迭代器。有人能帮忙吗

我不能使用push_back(),因为它总是附加到我不想要的结尾

// re-use start of vector when get to end
#include <vector>
#include <iostream>
#include <algorithm>

using std::cout;
using std::endl;
using std::vector;

class printme {
public:
   void operator() (int val) {cout << val << endl; }
};


//get a debug assertion - message says: vector iterators incompatible
//I assume this means that it is invalid after previous it++
int main(int argc, char* argv[])
{
   vector<int> myvec;
   myvec.resize(10);  //underlying array now has size=10 elements
   vector<int>::iterator it = myvec.begin();  //point to start of array
   for(int i = 0; i < 100; ++i) {
      if(it == myvec.end())           //on 2nd iteration crashes here - invalid iterator
         it = myvec.begin();

      myvec.insert(it++, i);
   }

   //print contents of vector - check 90-99 printed
   for_each(myvec.begin(), myvec.end(), printme());

    return 0;
}
//到达结束时重复使用向量的开始
#包括
#包括
#包括
使用std::cout;
使用std::endl;
使用std::vector;
类printme{
公众:

void operator()(int val){cout迭代器可以通过对向量执行某些操作而无效,包括
insert
。您需要重新检查
it
,以便能够在
insert
之后使用它

vector<int>::iterator it = myvec.begin();  //point to start of array
for(int i = 0; i < 100; ++i) {
   if(it == myvec.end())           //on 2nd iteration crashes here - invalid iterator
       it = myvec.begin();

   myvec.insert(it++, i);
   //it can be invalid here, re-fetch it
   it = myvec.begin();
}
vector::iterator it=myvec.begin();//指向数组的开头
对于(int i=0;i<100;++i){
if(it==myvec.end())//在第二次迭代时在此崩溃-迭代器无效
it=myvec.begin();
myvec.insert(it++,i);
//此处可能无效,请重新获取
it=myvec.begin();
}

迭代器可能会因向量上的某些操作而无效-包括
插入
。您需要重新检查
,以便在
插入
后使用它

vector<int>::iterator it = myvec.begin();  //point to start of array
for(int i = 0; i < 100; ++i) {
   if(it == myvec.end())           //on 2nd iteration crashes here - invalid iterator
       it = myvec.begin();

   myvec.insert(it++, i);
   //it can be invalid here, re-fetch it
   it = myvec.begin();
}
vector::iterator it=myvec.begin();//指向数组的开头
对于(int i=0;i<100;++i){
if(it==myvec.end())//在第二次迭代时在此崩溃-迭代器无效
it=myvec.begin();
myvec.insert(it++,i);
//此处可能无效,请重新获取
it=myvec.begin();
}

根据您对输出的期望-我相信您误解了
insert
的作用。 以这种方式实现循环(无需插入-仅需替换)。
std::vector::insert
将向量的大小增加一个-我相信这不是您所期望的

不要这样做:

myvec.insert(it++, i);
但这是:

 *it++ = i;
然后您将获得所需的输出:

   //print contents of vector - check 90-99 printed
   for_each(myvec.begin(), myvec.end(), printme());

从您对输出的期望来看,我相信您误解了
insert
的作用。 以这种方式实现循环(无需插入-仅需替换)。
std::vector::insert
将向量的大小增加一个-我相信这不是您所期望的

不要这样做:

myvec.insert(it++, i);
但这是:

 *it++ = i;
然后您将获得所需的输出:

   //print contents of vector - check 90-99 printed
   for_each(myvec.begin(), myvec.end(), printme());

我可以重新获取但不改变位置吗?类似于insert(val)然后“刷新”然后递增吗?@user619818:
insert
返回指向新元素的迭代器,您可以使用它。它可以是
it=myvec.insert(it,I);
it=myvec.insert(it,I)+1;
,我不确定您想要哪个。我可以重新获取但不改变位置吗?类似于insert(val)然后“刷新”然后递增吗?@user619818:
insert
返回一个指向新元素的迭代器,您可以使用它。它可以是
it=myvec.insert(it,I);
it=myvec.insert(it,I)+1;
,我不确定您想要哪个。是或myvec[inserter++%10]=I;-但您的版本不再需要int-intserter跟踪索引。谢谢。是或myvec[inserter++%10]=I;-但您的版本不再需要int-intserter跟踪索引。谢谢。