Что означает символ партнера?
Это означает какой-то ассоциативный контейнер, такой как std::set
. Обратите внимание, что он напечатан курсивом, что означает, что это не настоящий код, а местозаполнитель для фактического типа контейнера.
Есть ли 'badvalue' какое-то ключевое слово?
Нет, он предназначен для функции, определяемой программой, чтобы определить, должно ли быть удалено значение из контейнера. Он представлен на предыдущей странице, где говорится: «Давайте уничтожим каждый объект, для которого следующий предикат возвращает true».
В чем проблема с данным кодом
Это объясняется в книге, сразу же после того, как образец кода. erase(i)
делает недействительным итератор - это значит, что вы больше ничего не можете с ним делать - так что ++i
сразу же дает неопределенное поведение. Вместо этого, вы должны использовать код из позже на той же странице:
for (AssocContainer<int>::iterator i = c.begin(); i != c.end(); /* nothing */) {
if (badValue(*i)) c.erase(i++);
else ++i;
}
, который увеличивает i
перед тем стиранию и недействительности его старое значение.
Мое предположение заключается в том, что вы изменяете контейнер во время итерации через набор. Изменения должны выполняться с использованием итератора. – Kotte
Этот вопрос использует своего рода псевдокод, чтобы сделать точку. И когда вы знаете, что вы также знаете ответ на вопрос. Дело в том, что вы вызываете 'erase' на' iterator'. – Dialecticus
Лучшим заголовком для вопроса может быть «Пример книги использует классы, о которых я никогда не слышал», или «Пример, показывающий проблему с стиранием итераторов, не имеет смысла». –