C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: STLのiterator


(過去ログ 94 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■56488 / inTopicNo.1)  STLのiterator
  
□投稿者/ きょん (1回)-(2011/01/15(Sat) 01:18:33)

分類:[C/C++] 

VC++7.1以降のSTLのiteratorに関しての質問です。

std::vectorやstd::mapなどのcontainerを使用する際の
containerのelementのeraseのときは(std::vectorに限りませんが)、たとえば
vector<T>::iterator i = container.begin();
while ( i != container.end() ) {
  if ( 要素を削除したいなら ) {
    i = container.erase( i );
  }
}
とイディオムのように、呪文のようにずっとコードを書いてきました(勉強不足は承知しています)。
しかしstd::vectorの場合、codeを見ていて、i = container,erase( i )は必要がないと理解しました。
std::mapやstd::listは彼のcodeが必要なのも想像できますし、traceしていて確信も得たと思っています。
あくまでVC++7.1以降の話ですが…。

そこで質問なのですが、上記のcodeのi = container.erase( i )は
すべてのSTLのcontainerに通用するものなのでしょうか?
それとも
  if ( 要素を削除したいなら ) {
    container.erase( i );
    ++i;
  }
と書くのがSTLを扱う上でbetterなのでしょうか?


引用返信 編集キー/
■56489 / inTopicNo.2)  Re[1]: STLのiterator
□投稿者/ επιστημη (2594回)-(2011/01/15(Sat) 03:07:11)
επιστημη さんの Web サイト
条件を満たすものをコンテナから削除するなら、僕はこうする:

#include <iostream>
#include <algorithm>
#include <numeric>
#include <vector>

using namespace std;

int main() {
  vector<int> iv(10);
  iota(iv.begin(), iv.end(), 0); // iv = { 0, 1, 2 ... 9 }

  // 使用前
  for_each(iv.begin(), iv.end(), [](int n) { cout << n << ' ';});
  cout << endl;

  // 偶数を削除
  iv.erase(remove_if(iv.begin(),iv.end(),[](int n) { return n % 2 == 0;}), iv.end());

  // 使用後
  for_each(iv.begin(), iv.end(), [](int n) { cout << n << ' ';});
  cout << endl;
}

...てか、こんな話じゃないのかしら?

引用返信 編集キー/
■56492 / inTopicNo.3)  Re[2]: STLのiterator
□投稿者/ きょん (2回)-(2011/01/15(Sat) 10:57:05)
No56489 (επιστημη さん) に返信

あー…。
そうですね。containerを操作する適切なメソッドを使えば
containerの枝葉の違いを吸収してくれますね。
基本的なことに目を向けていませんでした…。

目が覚めました。
ありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -