container.erase (first, last) где first == последний в контейнерах STL - PullRequest
3 голосов
/ 13 октября 2011

Существует ли определенное поведение для container.erase (first, last), когда first == последний в STL, или оно не определено?

Пример:

std::vector<int> v(1,1);
v.erase(v.begin(),v.begin());
std::cout << v.size(); // 1 or 0?

Если есть документ спецификации стандартной библиотеки, в котором есть эта информация, я буду признателен за ссылку на него.

Ответы [ 4 ]

5 голосов
/ 13 октября 2011

Поведение четко определено.

Это неоперация (бездействие). Он не выполняет операции удаления контейнера, так как конец такой же, как и начало.

Соответствующие цитаты из стандарта следующие:

C ++ 03 Стандарт: 24.1 Требования к итераторам и
C ++ 11 Стандарт: 24.2.1 Требования к итераторам

Параграф 6 и 7 для обоих:

Итератор j называется достижимым из итератора i тогда и только тогда, когда существует конечная последовательность применений выражения ++ i, в которой i == j. Если j достижим из i, они ссылаются на один и тот же контейнер.

Большинство алгоритмических шаблонов библиотеки, которые работают с структурами данных, имеют интерфейсы, использующие диапазоны. Диапазон - это пара итераторов, которые обозначают начало и конец вычисления. Диапазон [i, i) является пустым диапазоном; в общем, диапазон [i, j) относится к элементам в структуре данных, начиная с элемента, на который указывает i, и до, но не включая элемент, на который указывает j. Диапазон [i, j) действителен тогда и только тогда, когда j достижим из i. Результат применения функций в библиотеке к недопустимым диапазонам не определен.

4 голосов
/ 13 октября 2011

Это вообще ничего не сотрет, как и другие алгоритмы, работающие в диапазонах [, ).

Даже если контейнер пуст, я думаю, что он все равно будет работать, потому что begin() == end().

1 голос
/ 13 октября 2011

Концептуально , существует обычный цикл от begin до end с условием простого цикла, который проверяет, равен ли уже итератор end, например:

void erase (iterator from, iterator to) {
    ...
    while (from != to) erase (from++);
    ...
}

(однако реализации могут отличаться). Как видите, если from==to, то нет единой итерации тела цикла.

1 голос
/ 13 октября 2011

Это отлично определено.Он удаляет все элементы от first до last, включая first и исключая last.Если в этом диапазоне нет элементов (когда first == last), то сколько их удаляют?Вы догадались, нет.

Хотя я не уверен, что произойдет, если first придет после last, я предполагаю, что это вызовет неопределенное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...