Как удалить несколько элементов из неупорядоченной карты, итерации по ней?
Пожалуйста, рассмотрите следующую ситуацию:
using namespace std;
unordered_map<int, vector<A>> elements;
Теперь я повторяю эту неупорядоченную карту:
for (auto it = elements.begin(); it != elements.end(); ++it)
Внутри цикла я формирую кластеры из нескольких элементов elements
(текущий, на который указывает it
, и некоторые другие, не обязательно следующие в строке!). Поскольку каждый элемент может быть только частью одного кластера, я хотел бы удалить его с карты, а затем продолжить со следующего элемента (т.е. Построить следующий кластер).
Как я могу это сделать и продолжать итерацию в правильной позиции?
Ответы
Ответ 1
for (auto it = elements.begin(); it != elements.end();) {
if(you have to rease) {
it = elements.erase(it);
}
else
it++;
}
Таким образом вы убедитесь, что после стирания не увеличиваетесь, и вы не увеличиваете значение end().
После предложений о том, что нет веской причины для цикла, который не увеличивает что-либо, вы, возможно, захотите использовать цикл while. В основном для большей удобочитаемости.
Ответ 2
unordered_map::erase
вернет итератор за удаленным элементом.
Вам нужен код в строках:
it = myMap.erase( it );
Важное примечание:. Если вы делаете это в цикле, вы должны убедиться, что вы избегаете типичного приращения it
в конце цикл, если это сделано.
Ответ 3
Функция erase
возвращает итератор после удаленного элемента (все функции erase
коллекций делают). Вы можете использовать это, чтобы продолжить.
Просто помните, чтобы не увеличивать итератор в случае, когда вы удаляете элемент, или вы перешагнете один элемент.