1

ベクトルを使用して、循環リストのような循環が可能なデータ構造を作成しようとしています。基になる配列を10個の要素で初期化する必要があると考えているサイズを変更します。イテレータを進められない理由がわかりません。誰か助けてくれませんか。

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;
}

編集ループを次のように変更しました:

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

   *it++ = i;
}

私は挿入を正しく理解していませんでした。

4

2 に答える 2

1

あなたがアウトプットに期待することから-私はあなたが何をしているのか誤解していると信じてinsertいます。この方法でループを実装します(挿入せずに、単に置き換えるだけです)。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());
于 2012-10-16T11:26:02.667 に答える
0

イテレータは、を含むベクトルに対するいくつかの操作によって無効にされる可能性がありますinsertitの後に使用できるようにするには、再フェッチする必要があります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();
}
于 2012-10-16T11:08:42.753 に答える