Измените значение в std :: map из итератора - PullRequest
3 голосов
/ 24 августа 2011

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

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

Ответы [ 2 ]

5 голосов
/ 24 августа 2011

Вам необходимо использовать 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; 
  }
}
2 голосов
/ 24 августа 2011

Можно, но вам нужно использовать итератор вместо const_iterator.

...