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?
Является ли сортировка векторов недействительными итераторами?
Ответ 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
, которые все еще указывают на первые и одно последние последние элементы вектора.