2013-02-12 3 views
0

Безопасно ли вызывать итерационные методы, такие как стирание контейнера STL (переопределение с использованием 2 итераторов), например. в моем случае std::vector::erase(), причем оба аргумента: vec.end()? Я сделал эксперимент, и похоже, что вызов просто ничего не делает, но я хочу быть уверенным, что могу безопасно его использовать в коде, иначе мне нужно проверить мои итераторы и избежать erase(), если они равны.std :: vector :: erase with equal arguments

+3

Да, это безопасно. –

+0

@SethCarnegie Это стандарт? Я имею в виду, могу ли я полностью полагаться на это, независимый от компилятора? cplusplus.com и cppreference.com не объясняют этот особый случай ... – cfa45ca55111016ee9269f0a52e771

+2

Да, это безопасно везде. Это не особый случай; 'erase' удаляет все элементы в диапазоне' [a, b) ', а если' a == b', он не удаляет элементы. –

ответ

7

С ++ Стандартный (n3337), 23.2.3, последовательности контейнеров, Таблица (требования 'контейнера последовательности) 100 - строка a.erase(q1,q2):

Эффекты: Стирание элементы в диапазоне [q1,q2).

Это значит, что a.erase(q,q) безопасен, потому что он ничего не делает.

Ответ Локи Астари на this SO question содержит список черновиков стандарта C++. К сожалению, официальная копия недоступна, поэтому я использую n3337, который, кажется, ближе всего к C++ 11.

+0

Можете ли вы добавить ссылку, если возможно? – StarPinkER

+0

@JermaineXu Done. – us2012

2

Это безопасно; он эффективный no-op, потому что end() -> end() - это диапазон, который пуст.

Смежные вопросы