Безопасно ли вызывать итерационные методы, такие как стирание контейнера STL (переопределение с использованием 2 итераторов), например. в моем случае std::vector::erase()
, причем оба аргумента: vec.end()
? Я сделал эксперимент, и похоже, что вызов просто ничего не делает, но я хочу быть уверенным, что могу безопасно его использовать в коде, иначе мне нужно проверить мои итераторы и избежать erase()
, если они равны.std :: vector :: erase with equal arguments
ответ
С ++ Стандартный (n3337), 23.2.3, последовательности контейнеров, Таблица (требования 'контейнера последовательности) 100 - строка a.erase(q1,q2)
:
Эффекты: Стирание элементы в диапазоне
[q1,q2)
.
Это значит, что a.erase(q,q)
безопасен, потому что он ничего не делает.
Ответ Локи Астари на this SO question содержит список черновиков стандарта C++. К сожалению, официальная копия недоступна, поэтому я использую n3337, который, кажется, ближе всего к C++ 11.
Можете ли вы добавить ссылку, если возможно? – StarPinkER
@JermaineXu Done. – us2012
Это безопасно; он эффективный no-op, потому что end() -> end() - это диапазон, который пуст.
- 1. нужен std :: vector with O (1) erase
- 2. using std :: vector :: erase with const_iterators
- 3. std :: equal with reverse_iterator
- 4. std :: vector :: erase exception safety
- 5. std :: vector :: erase() не хочет перемещать
- 6. std :: vector :: erase/remove_if result nullptr
- 7. std :: vector <std :: ofstream> :: erase дает ошибку компиляции
- 8. Vector Erase Error
- 9. Инициализация Eigen :: vector with std :: vector
- 10. arma :: vector mistaken with std :: vector
- 11. vector .erase error c2664
- 12. C++ std :: bad_alloc error with std :: vector
- 13. Использование std :: vector with Igraph
- 14. Назначение копирования/перемещения в std :: vector :: erase() и std :: deque :: erase()
- 15. vector :: erase вызывает странное поведение
- 16. C++ STL vector Deep erase
- 17. C++: vector :: erase вызываемый с итератором
- 18. Does std :: vector :: erase() аннулирует итератор в точке удаления?
- 19. Проходит векторный конец() в std :: vector :: erase valid?
- 20. Ошибка сегментации в std :: vector :: erase() в Visual C++
- 21. Почему std :: vector iterator недействителен после вызова erase()?
- 22. std :: vector :: erase (item) нужен оператор присваивания для элемента?
- 23. std :: vector :: erase() (многопоточность) 'Утверждение `px! = 0' не удалось. '
- 24. Как передать параметр "const_reverse_iterator" в "std :: vector :: erase()"?
- 25. Vector erase iterator Вне диапазона
- 26. размер std :: vector with struct elements
- 27. std :: vector to string with custom delimiter
- 28. Vector Erase by Iterator Location
- 29. C++ vector, erase не понимаю
- 30. STL Vector Erase Not Working
Да, это безопасно. –
@SethCarnegie Это стандарт? Я имею в виду, могу ли я полностью полагаться на это, независимый от компилятора? cplusplus.com и cppreference.com не объясняют этот особый случай ... – cfa45ca55111016ee9269f0a52e771
Да, это безопасно везде. Это не особый случай; 'erase' удаляет все элементы в диапазоне' [a, b) ', а если' a == b', он не удаляет элементы. –