2011-08-24 2 views
3

Мое приложение объединяет два экземпляра std::map. Если дубликатов нет, слияние завершается без вмешательства. Однако, если обнаружен дубликат, тогда метод спрашивает, следует ли игнорировать или перезаписывать новое значение. (На этот запрос может отвечать таблица правил, окно сообщения пользователю или какая-то другая логика ... это всего лишь экземпляр класса, полученного из чистого виртуального класса, с помощью метода bool confirm() const.)Изменение значения в std :: map с итератора

Если insert не удается, и они решают перезаписать существующую запись, у меня уже есть итератор, указывающий на правильный элемент для обновления. Могу ли я использовать этот итератор для непосредственного обновления значения, или мне нужно позвонить 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 и использовал здесь неконстантный итератор.) –

+0

Вы изменяете значение 'ret.first-> second'. –

Смежные вопросы