Шаг 204.
Библиотека STL. Контейнеры STL. Типы и функции контейнеров. Специальные функции для списков

    На этом шаге мы рассмотрим специальные функции для списков.

  void список::unique ()
  void список::unique (BinaryPredicate op)
Обе версии оставляют в списке лишь один элемент с каждым значением и удаляют все последующие дубликаты. В результате значение каждого элемента списка отличается от значения всех остальных элементов. Первая версия удаляет псе элементы, значение которых совпадает со значением одного из предшествующих элементов. Вторая версия удаляет все элементы, следующие после элемента е, для которых бинарный предикат ор(элемент,e) возвращает true. Другими словами, предикат используется не для сравнения элемента с предшественником; элемент сравнивается с предыдущим элементом, который не был удален. Предикат ор не должен изменять свое состояние во время вызова функции. Обе версии вызывают деструкторы для удаляемых элементов. Это специализированные версии алгоритма unique(), оптимизированные для списков. Функции генерируют исключения только в том случае, если исключения генерируются при сравнении элементов. Поддерживаются списками.

  void список::splice (iterator pos, список& source)
Перемещает все элементы source в *this и вставляет их в позиции итератора pos. После вызова список source остается пустым. Если source и *this определяют одно и то же место в памяти, вызов приводит к непредсказуемым последствиям. Следовательно, при вызове необходимо убедиться в том, что список source отличается от текущего списка. Для перемещения элементов внутри списка применяется следующая форма функции splice(). Перед вызовом необходимо убедиться в том, что итератор pos имеет допустимое значение; в противном случае вызов приводит к непредсказуемым последствиям. Функция не генерирует исключений.

  void список::splice (iterator pos, список& source, iterator sourcePos)
Перемещает элемент в позиции sourcePos списка source в *this и вставляет его в позиции итератора pos. Список source и указатель *this могут определять одно и то же место в памяти. В этом случае элемент перемещается внутри списка. Если source - другой список, после выполнения операции он содержит на один элемент меньше. Перед вызовом необходимо убедиться в том, что pos представляет действительную позицию в *this, sourcePos является действительным итератором source, а значение sourcePos отлично от source.end(); в противном случае вызов приводит к непредсказуемым последствиям. Функция не генерирует исключений.

  void список::spliсе (iterator pos, список& source,
              iterator sourceBeg, iterator sourceEnd)
Перемещает элементы из интервала [sourceBeg,sourceEnd) внутри списка source в *this и вставляет их в позицию итератора pos. Список source и указатель *this могут определять одно и то же место в памяти. В этом случае позиция pos не должна быть частью перемещаемого интервала, а элементы перемещаются внутри списка. Если source - другой список, после выполнения операции количество элементов в нем уменьшается. Перед вызовом необходимо убедиться в том, что pos представляет действительную позицию в *this, a sourceBeg и sourceEnd определяют действительный интервал в source; в противном случае вызов приводит к непредсказуемым последствиям. Функция не генерирует исключений.

  void список::sort ()
  void список::sort (CompFunc op)
Обе версии сортируют элементы списка. Первая версия сортирует все элементы оператором <. Вторая форма сортирует все элементы списка, сравнивая элементы функцией ор:
  op(elem1,elem2)
Порядок следования элементов с равными значениями сохраняется (если при вызове не было сгенерировано исключение). Это специализированные версии алгоритмов sort() и stable_sort(), оптимизированные для списков.
  void список::merge (список& source)
  void список::merge (список& source, CompFunc op)
Обе версии выполняют слияние элементов списков source и *this. После вызова список source остается пустым. Если перед вызовом списки *this и source отсортированы по критерию < или ор, итоговый список тоже будет отсортирован. Строго говоря, стандарт требует, чтобы оба списка были отсортированы перед вызовом, но на практике слияние также может выполняться и для несортированных списков. Тем не менее проведите дополнительную проверку, прежде чем выполнять слияние несортированных списков в своих программах. В первой форме используется оператор < в качестве критерия сортировки. Во второй форме используется необязательный критерий сортировки ор для сравнения двух элементов:
  op(elem1,elem2)
Это специализированные версии алгоритма merge(), оптимизированные для списков.

  void список::reverse ()
Переставляет элементы списка в обратном порядке. Это специализированная версия алгоритма reverse(), оптимизированная для cписков. Функция не генерирует исключений.

    Со следующего шага мы начнем знакомиться с поддержкой распределителей памяти.




Предыдущий шаг Содержание Следующий шаг