std::
list::merge
公众成员函数 <list>
C++98 |
(1) |
void merge (list& x); |
|
(2) |
template <class Compare>
void merge (list& x, Compare comp); |
C++11 |
(1) |
void merge (list& x);
void merge (list&& x); |
|
(2) |
template <class Compare>
void merge (list& x, Compare comp);
template <class Compare>
void merge (list&& x, Compare comp); |
合并已排序的容器
通过将x在其各自有序位置的所有元素转移到this容器(两个容器都应该已经有序),将x合并到this容器中。
这将删除了x中的所有元素(变为空元素),并将它们插入到this容器中的有序位置
(容器的大小会随着转移的元素数量而扩大)。该操作在不构造或销毁任何元素的情况下执行:
不管x是左值还是右值,也不管value_type是否支持move-construction,都将传递元素。
带有两个形参(2)的模板版本具有相同的行为,但采用一个特定的谓词(comp)来执行元素之间的比较操作。
这种比较将产生元素的严格弱排序(即,不考虑自反性的一致传递比较)。
这个函数要求列表容器的元素在调用之前已经按值(或按comp)排序。
有关无序列表的替代方法,请参见list::splice。
根据 operator< 或 comp 定义的严格弱顺序,将x的每个元素插入到其值对应的位置。
现有元素位于从x插入的等价元素之前)。
如果(&x == this),函数什么也不做。
☲ 参数
-
x
-
一个相同类型的列表对象(即,具有相同的模板参数T和Alloc)。
注意,无论传递的是左值还是右值引用,该函数都会修改x。
-
comp
-
二元谓词,接受两个与列表中包含的值类型相同的值,
如果第一个参数按照它定义的严格弱顺序被认为位于第二个参数之前,
则返回true,否则返回false。
这应该是一个函数指针或函数对象。
☉ 返回值
none
☣ 示例
// list::merge
#include <iostream>
#include <list>
// compare only integral part:
bool mycomparison (double first, double second)
{ return ( int(first)<int(second) ); }
int main ()
{
std::list<double> first, second;
first.push_back (3.1);
first.push_back (2.2);
first.push_back (2.9);
second.push_back (3.7);
second.push_back (7.1);
second.push_back (1.4);
first.sort();
second.sort();
first.merge(second);
// (second is now empty)
second.push_back (2.1);
first.merge(second,mycomparison);
std::cout << "first contains:";
for (std::list<double>::iterator it=first.begin(); it!=first.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
} |
请注意,在第二次合并中,函数mycomparison(只比较完整的部分)
没有考虑2.1低于2.2或2.9,所以它被插入在它们之后,3.1之前。
输出:
first contains: 1.4 2.2 2.9 2.1 3.1 3.7 7.1
✥ 复杂度
两个容器的大小之和最多是线性的(比较)。
☣ 迭代器的有效性
在调用之前,与容器相关的迭代器、指针和引用没有变化。
指向已转移元素的迭代器、指针和引用继续指向相同的元素,
但迭代器现在将迭代到已转移元素所在的容器中。
⇄ 数据竞争
容器和x都被修改了。
并发访问或修改它们的元素是安全的,尽管遍历任何一个容器都不安全。
☂ 异常安全性
如果两个容器中的分配器不相等,如果comp没有定义严格的弱排序,
或者容器元素没有按照它排序,则会导致未定义的行为。
否则,如果比较引发异常,则容器将保持有效状态(基本保证)。
如果抛出异常,则容器中没有任何更改(强保证)。
🍄 另请参阅
list::splice |
从另一个list转移元素(公众成员函数) |
list::remove |
按值删除元素(公众成员函数) |
list::insert |
插入元素(公众成员函数) |
list::push_back |
在末尾添加元素(公众成员函数) |
list::erase |
删除元素(公众成员函数) |