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

Является ли сортировка векторов недействительными итераторами?

 std::vector<string> names;
 std::vector<string>::iterator start = names.begin();
 std::vector<string>::iterator end = names.end();
 sort (start,end);
 //are my start and end valid at this point?
 //or they do not point to front and tail resp?
4b9b3361

Ответ 1

В соответствии со стандартом С++ и секцией 23.1/11:

Если не указано иначе (явно или путем определения функции в терминах других функций), вызывая функция-член контейнера или передача контейнера в качестве аргумента функции библиотечной функции не должны аннулировать iterators, или изменить значения объектов в этом контейнере.

& sect; 25.3 "Сортировка и связанные операции" не указывает, что итераторы будут недействительными, поэтому итераторы в вопросе должны оставаться в силе.

Ответ 2

Они все еще указывают на начало и конец. Значения в этих слотах вектора, вероятно, изменились, но место хранения, в котором они находятся, остается неизменным.

Ответ 3

std::sort не приведет к аннулированию итератора вектором. Шаблон сортировки использует оператор * в итераторах для доступа и изменения содержимого вектора и изменения векторного элемента, хотя итератор к элементу, уже находящемуся в векторе, не приведет к аннулированию любых итераторов.

Таким образом,

  • существующие итераторы не будут признаны недействительными.
  • однако элементы, на которые они указывают, могут быть изменены

В дополнение к поддержке стандарта, предоставленного Кириллом В. Лядвинским (Является ли векторный сортировка недействительными итераторами?):

  • 25/5 "Библиотека алгоритмов"

Если в разделе "Эффекты эффектов" сказано что значение, на которое указывает любое итератором, переданным в качестве аргумента, является изменен, то этот алгоритм имеет требование дополнительного типа: Тип этого аргумента удовлетворяет требования к изменяемому итератору (24.1).

  • 24.1/4 "Требования к итератору"

Помимо своей категории, двунаправленный или произвольный доступ итератор также может быть изменен или постоянной в зависимости от того, результат выражения * я ведет себя как ссылку или ссылку на константа.

Ответ 4

std::vector сохраняет свои элементы в непрерывной памяти. std::sort принимает аргументы (итераторы) по значению и повторно упорядочивает последовательность между ними. Конечным результатом являются ваши локальные переменные start и end, которые все еще указывают на первые и одно последние последние элементы вектора.