std::list<T,Allocator>::merge
void merge( list& other ); | (1) | |
void merge( list&& other ); | (2) | (начиная с C++11) |
template< class Compare > void merge( list& other, Compare comp ); | (3) | |
template< class Compare > void merge( list&& other, Compare comp ); | (4) | (начиная с C++11) |
Функция ничего не делает, если other ссылается на тот же объект, что и *this.
В противном случае other объединяется с *this. Оба списка должны быть отсортированы. Элементы не копируются, а контейнер other становится пустым после объединения. Эта операция стабильна: для эквивалентных элементов в обоих списках элементы из *this всегда предшествуют элементам из other, а порядок эквивалентных элементов в *this и other не меняется.
Ни один итератор или ссылка не становится недействительным. Указатели и ссылки на элементы, перемещённые из *this, а также итераторы, ссылающиеся на эти элементы, будут ссылаться на те же элементы в *this, а не в other.
std::less<T>()(до C++14)std::less<>()(начиная с C++14).comp.Если *this или other не отсортирован относительно соответствующего компаратора либо get_allocator() != other.get_allocator(), поведение не определено.
Параметры
| other | - | другой контейнер для объединения |
| comp | - | объект функции сравнения (то есть объект, удовлетворяющий требованиям Compare), который возвращает true, если первый аргумент меньше второго (то есть расположен перед ним). Сигнатура функции сравнения должна быть эквивалентна следующей: boolcmp(constType1&a,constType2&b); Хотя сигнатура не обязательно должна содержать const&, функция не должна изменять переданные ей объекты и должна принимать все значения типов (возможно, константных) |
| Требования к типам | ||
-Compare должен удовлетворять требованиям Compare. |
||
Возвращаемое значение
отсутствует
Исключения
Если по какой-либо причине выбрасывается исключение, эти функции не оказывают никакого эффекта (гарантия строгой безопасности исключений). Исключение составляет случай, когда исключение возникает при сравнении.
Сложность
Если other ссылается на тот же объект, что и *this, сравнения не выполняются.
В противном случае, если \(\scriptsize N\)N — это std::distance(begin(), end()), а \(\scriptsize R\)R — это std::distance(other.begin(), other.end()):
comp.Пример
#include <iostream>
#include <list>
std::ostream& operator<<(std::ostream& ostr, const std::list<int>& list)
{
for (const int i : list)
ostr << ' ' << i;
return ostr;
}
int main()
{
std::list<int> list1 = {5, 9, 1, 3, 3};
std::list<int> list2 = {8, 7, 2, 3, 4, 4};
list1.sort();
list2.sort();
std::cout << "list1: " << list1 << '\n';
std::cout << "list2: " << list2 << '\n';
list1.merge(list2);
std::cout << "merged:" << list1 << '\n';
}
Вывод:
list1: 1 3 3 5 9 list2: 2 3 4 4 7 8 merged: 1 2 3 3 3 4 4 5 7 8 9
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение согласно опубликованному стандарту | Исправленное поведение |
|---|---|---|---|
| LWG 300 | C++98 | эффект в случае, когда *this и other ссылалисьна один и тот же объект, не был определён | определено как операция, не выполняющая никаких действий |
| LWG 1207 | C++98 | не было ясно, становятся ли итераторы и/или ссылки недействительными | остаются действительными |
| LWG 1215 | C++98 | перемещение узлов за O(1) нельзя было гарантировать, еслиget_allocator() != other.get_allocator() | в этом случае поведение не определено |
| LWG 3088 | C++98 | operator< мог некорректно работать для элементов-указателей | используется определяемый реализацией строгий полный порядок |
См. также
перемещает элементы из другого list (открытая функция-член) |
|
| объединяет два отсортированных диапазона (шаблон функции и объект-функция алгоритма) |
|
|
(C++20) | |
| объединяет на месте два упорядоченных диапазона (шаблон функции и объект-функция алгоритма) |
|
|
(C++20) | |
|
(C++20) | объединяет два отсортированных диапазона (объект-функция алгоритма) |
|
(C++20) | объединяет на месте два упорядоченных диапазона (объект-функция алгоритма) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/list/merge