スポンサーサイト
--/--/-- (--) --:--:--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
スポンサー広告 | page top↑
C++ std::vectorのeraseとinsertについてのメモ
2009/11/17 (Tue) 00:09:17
  • iterator erase( iterator start, iterator end ); start とend の間にある要素を削除
  • void insert( iterator pos, input_iterator start, input_iterator end ); start から end までの要素を pos の直前に挿入する。
erase: http://msdn.microsoft.com/ja-jp/library/ceh559x2%28VS.71%29.aspx
insert: http://msdn.microsoft.com/ja-jp/library/s5bta5ha%28VS.71%29.aspx


vector要素の並べ替えが必要な作業があったので、eraseとinsertを使うことにした。

例えば"10, 20, 30, 40"を"30, 40, 10, 20"とするのに
まず"10, 20, 30, 40"の前2つを末尾にinsertして、"10, 20, 30, 40, 10, 20"、
次に"10, 20, 30, 40, 10, 20"の前2つをeraseして、"30, 40, 10, 20"とした。
コードは以下。

vector v1;
v1.push_back( 10 );
v1.push_back( 20 );
v1.push_back( 30 );
v1.push_back( 40 ); // v1:"10, 20, 30, 40"

v1.insert(v1.begin() + 4, v1.begin(), v1.begin() + 2); // v1:"10, 20, 30, 40, 10, 20"

v1.erase( v1.begin( ), v1.begin() + 2); // v1:"30, 40, 10, 20"


ここまではいいのだが、このv1にさらに次のinsertを行った所で実行時エラーとメモリリークが起こった。

v1.insert(v1.begin(), v1.begin() + 2, v1.begin() + 4); //★ v1:"10, 20, 30, 40, 10, 20"となって欲しいが実行時エラー。

エラーメッセージは"Vector iterators incompatible"でイテレータが不正、ということらしい。
eraseしたからv1.begin()がおかしくなっているってこと?
eraseした後でも
vector ::iterator Iter;
for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
cout << " " << *Iter;
みたいな典型的なコードはきちんと動くのに何がおかしいのか・・・?

調べてもわからなかったので結局一時コピー用の別のvectorを用意して★の行を

vector v2;
copy(v1.begin() + 2, v1.begin() + 4, back_inserter(v2)); //v2:"10, 20"
v1.insert(v1.begin(), v2.begin(), v2.end()); //v1:"10, 20, 30, 40, 10, 20"

の3行に置き換えることでエラーは回避できた。

うーん、とりあえずこれで動くものは作れたけど、よくわからない!
理由の分かる方、是非教えてください。

vectorの操作って多分いかにも基本的なことなんだろうになあ・・・。
---------------
2010/4/8 追記

再度調べたら、解決した。
参考にしたMSDNのサンプルコードが不適切だったようだ。

C++の仕様では
insert( iterator pos, input_iterator start, input_iterator end )
の第2、第3引数のstart, endに自分のイテレータを指定してはいけないそうだ。

http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200804/08040053.txt
http://social.msdn.microsoft.com/forums/ja-JP/vddocumentsja/thread/4db4059f-b774-4bbd-b169-1a769d7ce083/

C++の規格書はここで読める。
http://www.jisc.go.jp/app/pager?id=32530
・・・が、読みづらい。
プログラミング | トラックバック(0) | コメント(0) | page top↑
<<スピードパス | ホーム | タイトルなし>>
コメント
コメントの投稿













管理者にだけ表示を許可する

トラックバック
トラックバックURL
→http://kerorou.blog84.fc2.com/tb.php/124-05100a4c
| ホーム |
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。