2010-11-24 14 views
4

std::map<X,std::vector<Y> >を反復処理すると、ベクターを並べ替えることができますか、それともイテレータを無効にすることができますか?std :: map <X、std :: vector <Y>>を繰り返し、ベクトルを並べ替える

つまり、次のコードは大丈夫ですか?

typedef std::map<int, std::vector<int> > Map; 
Map m; 
for (Map::iterator it = m.begin(); it != m.end(); ++it) { 
    std::sort(it->second.begin(), it->second.end()); 
} 

答えて

6

あなたのコードは大丈夫です。 mapのイテレータは、マップから要素を削除すると無効になります。 STLコンテナの要素を変更すると、そのコンテナのイテレータが無効になることはなく、コンテナ自体の操作だけが削除されたり、時には要素が追加されたりすることがあります。

+2

これは少し曖昧で誤解を招くこともあります。 "マップからのイテレータは、要素を削除すると無効になります" - 削除された特定の要素に対するイテレータのみが無効になります。 Str :: map、std :: multimap、std :: setなどのイテレータを無効にすることはありません。 –

2

コードは完全に問題ありません。実際には、mapから要素を挿入したり取り除いたりしていないので、疑問の余地はありません。mapの構造は変更されておらず、格納されている値にのみ影響しています。

0

ascheplerによると、あなたのコードは問題ありません。私はマップがそのターゲットとして持っているベクトルとベクトルの中の値の間に区別があるということを付け加えたいと思います。このため、マップ内に影響を与えずにベクトル内の値を変更することができます。

+0

私はそうではありませんあなたは何を区別しているのか分かりますか? – HighCommander4

2

std :: mapsは、既存のイテレータを無効にすることなく新しい要素を挿入でき、要素を削除すると、その特定の要素に対するイテレータのみが無効になるという点で特別です。イテレータをマップに与えると、キーを変更することはできません(そうでなければ、並べ替え順序が破損してしまう - コンテナの不変量の1つです)。ただし、好きなように値を変更することができます。あなたの配列の並べ替えは、この最後の操作カテゴリに分類され、完璧です。 http://www.sgi.com/tech/stl/Map.html

地図はマップに新しい要素を挿入すると、既存の要素を指すイテレータを無効にしないことが重要な特性を持っている:SGIのSTLのページから引用し

。マップから要素を消去しても、消去される要素を実際に指すイテレータ以外のイテレータは無効になりません。

関連する問題