2015年7月4日土曜日

c++ vector iterator index取得とその使用の注意点

まれにiteratorのindexを取得したい場合がある。が、ほんとはこんなことしない方がいいのはわかるが、iteratorの要素ごとの相互関係を定義したいときに使おうと思って試してみた。

#include <vector>

vector<int> v;
vector<int>::iterator it;

for(int i=0; i<10; ++i) v.push_back(i);

it = find(v.begin(), v.end(), 3);

cout << it - v.begin() <<endl;

結果:
3

とりあえずうまく行きそうだが、これってデータを追加・削除するときにbeginのデータがなくなったりしたら順番が全部変わる気がする。試してみよう。erase で 3 の格納されている要素を消してみる。

#include <iostream>
#include <vector>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
vector<int> v;
vector<int>::iterator it;

for (int i = 0; i<10; ++i) v.push_back(i);

it = find(v.begin(), v.end(), 3);

//cout << it - v.begin() << endl;

v.erase(it);

it = find(v.begin(), v.end(), 2);

cout << it - v.begin() << endl;

it = find(v.begin(), v.end(), 4);

cout << it - v.begin() << endl;

return 0;
}

結果:
2
3

2の入っている要素は変わらないが、4の入っている要素が繰り上がって3になっている。

よって、このアルゴリズムを使う注意点としては、要素をpush_backで追加したときはそれまでの要素のIndexがかわらないが、削除した時は変わってしまうことであろう。注意する。


参考
http://kogecoo.hatenablog.com/entry/20090731/1248994749

0 件のコメント:

コメントを投稿