2011-08-24 10 views
3

私のアプリケーションは2つのstd::mapのインスタンスをマージします。重複がない場合、マージは介入なしで完了します。ただし、重複が検出された場合、メソッドは新しい値を無視するか上書きするかを尋ねます。 (このクエリは、ルールテーブル、ユーザへのメッセージボックス、またはその他のロジックによって応答される可能性があります。これは、bool confirm() constメソッドを持つ純粋な仮想クラスから派生したクラスのインスタンスです)。イテレータからstd :: mapの値を変更します

挿入が失敗し、既存のエントリを上書きすることにした場合、更新する正しい項目を指すイテレータが既にあります。このイテレーターを使用して値を直接更新することはできますか、operator[]に電話してもう一度検索する必要がありますか?

// typedef std::map<Foo, Foo, Compare> Dictionary; 
// Dictionary this_dictionary, other_dictionary; 
for (Dictionary::const_iterator i = other_dictionary.begin(); 
    i != other_dictionary.end(); 
    ++i) { 
    std::pair<Dictionary::iterator,bool> ret = this_dictionary.insert(*i); 
    if (!ret.second && confirmer.confirm()) { 
    // ??? 
    } 
} 

答えて

5

Dictionary::const_iteratorの代わりにDictionary::iteratorを使用する必要があります。

for (Dictionary::const_iterator i = other_dictionary.begin(); 
    i != other_dictionary.end(); 
    ++i) { 
    // Use standard iterator here 
    std::pair<Dictionary::iterator,bool> ret = this_dictionary.insert(*i); 
    if (!ret.second && confirmer.confirm()) { 
    ret.first->second = i->first; 
    } 
} 
+0

もちろん!何らかの理由で 'pair :: second'が値の変更不可能なコピーを返すと思っていました。ありがとう! –

2

ただし、const_iteratorの代わりにiteratorを使用する必要があります。

+0

ただし、イテレータではどうしますか? (私は元の質問を修正しました; const_iteratorはコピー&ペーストエラーでした。私の実際のコードには、より多くのtypedefがありましたので、ここに投稿するために削除して、ここで非constイテレータを使用していました)。 –

+0

'ret.first-> second'です。 –

関連する問題