26 Containers library [containers]

26.3 Sequence containers [sequences]

26.3.10 Class template list [list]

26.3.10.5 list operations [list.ops]

Поскольку списки позволяют быстро вставлять и стирать из середины списка, определенные операции предусмотрены специально для них.259

list предоставляет три операции соединения, которые разрушающе перемещают элементы из одного списка в другой. Поведение операций соединения не определено, если get_­allocator() != x.get_­allocator().

void splice(const_iterator position, list& x); void splice(const_iterator position, list&& x);

Requires: &x != this.

Effects: Вставляет содержимое x до position и x становится пустым. Указатели и ссылки на перемещенные элементы x теперь относятся к тем же элементам, но как к членам *this. Итераторы, относящиеся к перемещенным элементам, будут продолжать ссылаться на свои элементы, но теперь они ведут себя как итераторы в *this, а не в x.

Throws: Ничего такого.

Complexity: Постоянное время.

void splice(const_iterator position, list& x, const_iterator i); void splice(const_iterator position, list&& x, const_iterator i);

Requires: i - допустимый разыменяемый итератор для x.

Effects: Вставляет элемент , на который указывает i из списка ,x прежде чем position и удаляет элемент из x. Результат не меняется, если position == i или position == ++i. Указатели и ссылки, чтобы *i продолжать ссылаться на этот же элемент, но как на член *this. Итераторы *i (включая i себя) продолжают ссылаться на один и тот же элемент, но теперь ведут себя как итераторы в *this, а не в x.

Throws: Ничего такого.

Complexity: Постоянное время.

void splice(const_iterator position, list& x, const_iterator first, const_iterator last); void splice(const_iterator position, list&& x, const_iterator first, const_iterator last);

Requires: [first, last) допустимый диапазон в x. Программа имеет неопределенное поведение, если position является итератором в диапазоне [first, last).

Effects: Вставляет элементы в диапазон [first, last) до position и удаляет элементы из x. Указатели и ссылки на перемещенные элементы x теперь относятся к тем же элементам, но как к членам *this. Итераторы, относящиеся к перемещенным элементам, будут продолжать ссылаться на свои элементы, но теперь они ведут себя как итераторы в *this, а не в x.

Throws: Ничего такого.

Complexity: Постоянное время, если &x == this; в противном случае - линейное время.

void remove(const T& value); template <class Predicate> void remove_if(Predicate pred);

Effects: Удаляет все элементы в списке, на которые ссылается итератор списка, i для которого выполняются следующие условия: *i == value, pred(*i) != false. Делает недействительными только итераторы и ссылки на удаленные элементы.

Throws: Ничего, если исключение не вызвано *i == value или pred(*i) != false.

Remarks: Stable.

Complexity: Точно size() применения соответствующего предиката.

void unique(); template <class BinaryPredicate> void unique(BinaryPredicate binary_pred);

Effects: Удаляет все элементы, кроме первого, из каждой последовательной группы равных элементов, на которую ссылается итератор i в диапазоне, [first + 1, last) для которого *i == *(i-1) (для версии unique без аргументов) или pred(*i, *(i - 1)) (для версии unique с аргументом предиката) выполняется. Делает недействительными только итераторы и ссылки на удаленные элементы.

Throws: Ничего, если исключение не вызвано *i == *(i-1) или pred(*i, *(i - 1))

Complexity: Если диапазон [first, last) не пуст, то это точно (last - first) - 1 применения соответствующего предиката, в противном случае - никакие применения предиката.

void merge(list& x); void merge(list&& x); template <class Compare> void merge(list& x, Compare comp); template <class Compare> void merge(list&& x, Compare comp);

Requires: comp должен определять a strict weak ordering, и как список, так и список аргументов должны быть отсортированы в соответствии с этим порядком.

Effects: Если (&x == this) ничего не делает; в противном случае объединяет два отсортированных диапазона [begin(), end()) и [x.​begin(), x.end()). Результатом является диапазон, в котором элементы будут отсортированы в неубывающем порядке в соответствии с порядком, определенным с помощью comp; то есть для каждого итератора iв диапазоне, отличном от первого, условие comp(*i, *(i - 1)) будет false. Указатели и ссылки на перемещенные элементы x теперь относятся к тем же элементам, но как к членам *this. Итераторы, относящиеся к перемещенным элементам, будут продолжать ссылаться на свои элементы, но теперь они ведут себя как итераторы в *this, а не в x.

Remarks: Stable. Если после слияния (&x != this) диапазон [x.begin(), x.end())пуст. Эта операция не копирует никакие элементы. Поведение не определено, если get_­allocator() != x.get_­allocator().

Complexity: В большинстве size() + x.size() - 1 приложений comp if (&x != this); в противном случае приложения comp не выполняются. Если исключение выбрасывается иначе, чем путем сравнения, нет никаких эффектов.

void reverse() noexcept;

Effects: Меняет порядок элементов в списке на обратный. Не влияет на валидность итераторов и ссылок.

Complexity: Линейное время.

void sort(); template <class Compare> void sort(Compare comp);

Requires: operator< (для первой версии) или comp (для второй версии) должен определять файл strict weak ordering.

Effects: Сортирует список по объекту operator< или Compare функции. Если выбрасывается исключение, порядок элементов в нем *this не указан. Не влияет на валидность итераторов и ссылок.

Remarks: Stable.

Complexity: Примерно NlogN сравнения, где N == size().

Как указано в [allocator.requirements], требования этого пункта применяются только к спискам, распределители которых сравниваются одинаково.