Подтвердить что ты не робот

Как удалить несколько элементов из неупорядоченной карты, итерации по ней?

Пожалуйста, рассмотрите следующую ситуацию:

using namespace std;
unordered_map<int, vector<A>> elements;

Теперь я повторяю эту неупорядоченную карту:

for (auto it = elements.begin(); it != elements.end(); ++it)

Внутри цикла я формирую кластеры из нескольких элементов elements (текущий, на который указывает it, и некоторые другие, не обязательно следующие в строке!). Поскольку каждый элемент может быть только частью одного кластера, я хотел бы удалить его с карты, а затем продолжить со следующего элемента (т.е. Построить следующий кластер).

Как я могу это сделать и продолжать итерацию в правильной позиции?

4b9b3361

Ответ 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 коллекций делают). Вы можете использовать это, чтобы продолжить.

Просто помните, чтобы не увеличивать итератор в случае, когда вы удаляете элемент, или вы перешагнете один элемент.