Сортирует ли вектор итераторы? - PullRequest
24 голосов
/ 08 октября 2010
 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?

Ответы [ 4 ]

21 голосов
/ 08 октября 2010

В соответствии со стандартом C ++ §23.1 / 11:

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

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

13 голосов
/ 08 октября 2010

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

7 голосов
/ 08 октября 2010

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

В итоге

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

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

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

Если в разделе «Эффекты алгоритма» написано что значение, указанное любым итератор передан в качестве аргумента модифицированный, то этот алгоритм имеет дополнительное требование типа: тип из этого аргумента должны удовлетворять требования изменяемого итератора (24,1).

  • 24.1 / 4 «Требования к итераторам»

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

1 голос
/ 08 октября 2010

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

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