2011-08-24 78 views
3

我的應用程序合併了兩個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::iterator而不是Dictionary::const_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。

+0

好的,但你對迭代器做了什麼? (我修改了原來的問題; const_iterator是一個複製粘貼的錯誤;我的實際代碼有更多的typedefs,我刪除後發佈在SO上,並在此處使用非const迭代器。) –

+0

您修改'ret.first->秒'。 –

相關問題