Поскольку списки позволяют быстро вставлять и стирать из середины списка, определенные операции предусмотрены специально для них.259
list предоставляет три операции соединения, которые разрушающе перемещают элементы из одного списка в другой. Поведение операций соединения не определено, если get_allocator() != x.get_allocator().
void splice(const_iterator position, list& x);
void splice(const_iterator position, list&& x);
Effects: Вставляет содержимое x до position и x становится пустым. Указатели и ссылки на перемещенные элементы x теперь относятся к тем же элементам, но как к членам *this. Итераторы, относящиеся к перемещенным элементам, будут продолжать ссылаться на свои элементы, но теперь они ведут себя как итераторы в *this, а не в x.
void splice(const_iterator position, list& x, const_iterator i);
void splice(const_iterator position, list&& x, const_iterator i);
Effects: Вставляет элемент , на который указывает i из списка ,x прежде чем position и удаляет элемент из x. Результат не меняется, если position == i или position == ++i. Указатели и ссылки, чтобы *i продолжать ссылаться на этот же элемент, но как на член *this. Итераторы *i (включая i себя) продолжают ссылаться на один и тот же элемент, но теперь ведут себя как итераторы в *this, а не в x.
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.
void remove(const T& value);
template <class Predicate> void remove_if(Predicate pred);
Effects: Удаляет все элементы в списке, на которые ссылается итератор списка, i для которого выполняются следующие условия: *i == value, pred(*i) != false. Делает недействительными только итераторы и ссылки на удаленные элементы.
void unique();
template <class BinaryPredicate> void unique(BinaryPredicate binary_pred);
Effects: Удаляет все элементы, кроме первого, из каждой последовательной группы равных элементов, на которую ссылается итератор i в диапазоне, [first + 1, last) для которого *i == *(i-1) (для версии unique без аргументов) или pred(*i, *(i - 1)) (для версии unique с аргументом предиката) выполняется. Делает недействительными только итераторы и ссылки на удаленные элементы.
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.
Complexity: В большинстве size() + x.size() - 1 приложений comp if (&x != this); в противном случае приложения comp не выполняются. Если исключение выбрасывается иначе, чем путем сравнения, нет никаких эффектов.
void reverse() noexcept;
Effects: Меняет порядок элементов в списке на обратный. Не влияет на валидность итераторов и ссылок.
void sort();
template <class Compare> void sort(Compare comp);
Requires: operator< (для первой версии) или comp (для второй версии) должен определять файл strict weak ordering.
Effects: Сортирует список по объекту operator< или Compare функции. Если выбрасывается исключение, порядок элементов в нем *this не указан. Не влияет на валидность итераторов и ссылок.
Как указано в [allocator.requirements], требования этого пункта применяются только к спискам, распределители которых сравниваются одинаково.