3

どこで間違ったのかわかりません。私が理解しているように、このコードは「1、2、3」を返すはずですが、次のようになります。ベクトルとそのイテレータをグローバルに宣言する必要があります。これは、実際のコードでベクトルを関数に渡し、一部の関数でイテレータも更新する必要があるためです。どんな助けでも大歓迎です!

#include <iostream>
#include <vector>

using namespace std;

vector<float> grid;
vector<float>::iterator gridPtr;

int main()

{
  grid.push_back(1);
  grid.push_back(2);

  gridPtr = grid.begin();

  grid.push_back(3);

  cout << "gridPtr: " << *gridPtr << endl;

  gridPtr++;

  cout << "gridPtr: " << *gridPtr << endl;

  gridPtr++;

  cout << "gridPtr: " << *gridPtr << endl;
}

これは以下を返します:

gridPtr: 2.62257e-33
gridPtr: 2
gridPtr: 0
4

3 に答える 3

4

push_back()すべてのイテレータを無効にする可能性があります。つまり、バッキング ストアを再割り当てする必要がある場合、既存のすべての反復子が無効になります。

プッシュする要素の数が事前にわかっている場合は、 を使用reserve()して必要なメモリを事前に割り当てることができます。これによりpush_back()、再割り当て (したがってイテレータの無効化) を防ぐことができます。

于 2013-03-29T01:34:20.873 に答える
2

http://en.cppreference.com/w/cpp/container/vector/push_backから:

newsize()が より大きい場合capacity()、すべての反復子と参照が無効になります。

(私のものを強調してください。)

これは、内部で何が起こっているかを考えると理にかなっています。avectorは、動的に割り当てられた配列を埋めることによって機能します。いっぱいになると、より大きなものを再割り当てし、すべてを移動する必要があります。

于 2013-03-29T01:34:30.687 に答える
1

を実行すると無効になるiterator場合がありますpush_back。その行を削除すると、正常に動作するはずです。以下は期待どおりに機能します。

grid.push_back(1);
grid.push_back(2);

gridPtr = grid.begin();
cout << "gridPtr: " << *gridPtr << endl;
gridPtr++;
cout << "gridPtr: " << *gridPtr << endl;

ケビンが述べたように、reserve事前に十分なメモリを割り当てるために使用すると、問題も修正されます。

grid.reserve(3) ;
grid.push_back(1);
grid.push_back(2);

gridPtr = grid.begin();

grid.push_back(3) ;
cout << "gridPtr: " << *gridPtr << endl;
gridPtr++;
cout << "gridPtr: " << *gridPtr << endl;
gridPtr++;
cout << "gridPtr: " << *gridPtr << endl;
于 2013-03-29T01:34:46.647 に答える