在调整矢量大小后,为什么我不能增加矢量

时间:2012-10-16 11:07:33

标签: c++ vector

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

我不能使用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;
}

EDIT 将循环更改为:

for(int i = 0; i < 100; ++i) {
   if(it == myvec.end())
      it = myvec.begin();

   *it++ = i;
}

我没有正确理解插入。

2 个答案:

答案 0 :(得分:1)

根据您对输出的期望 - 我相信您误解了insert正在做什么。 以这种方式实现你的循环(没有insering - 只是替换)。 std::vector<>::insert将向量的大小增加1 - 我相信这不是您所期望的。

不要这样做:

myvec.insert(it++, i);

但是这个:

 *it++ = i;

然后你会得到你想要的输出:

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

答案 1 :(得分:0)

迭代器可能会被向量上的某些操作失效 - 包括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();
}