std::
forward_list::merge
公众成员函数 <forward_list>
(1) |
void merge (forward_list& fwdlst);
void merge (forward_list&& fwdlst); |
2) |
template <class Compare>
void merge (forward_list& fwdlst, Compare comp);
template <class Compare>
void merge (forward_list&& fwdlst, Compare comp); |
合并已排序的容器
将fwdlst合并到 *this中,方法是将fwdlst在其各自有序位置的所有元素转移到*this容器中(两个容器都应该已经有序)。
这将删除fwdlst中的所有元素(变为空元素),并将它们插入到*this容器中的有序位置
(容器的大小会随着转移的元素数量而扩大)。该操作在不构造或销毁任何元素的情况下执行:
不管fwdlst是左值还是右值,也不管value_type是否支持move-construction,都将转移元素。
带有两个形参(2)的模板版本具有相同的行为,但采用一个特定的谓词(comp)来执行元素之间的比较操作。
这种比较将产生元素的严格弱排序(即,不考虑自反性的一致可传递比较)。
这个函数要求forward_list容器在调用之前已经按照值(或comp)排序了它们的元素。
有关无序列表的替代方法,请参见list::splice。
容器保留它当前的分配器,除非分配器特征表明fwdlst的分配器应该传递。
这个分配器(通过它的特性)用于在存储需求发生变化时进行分配或释放,以及在需要时构造或销毁元素。
fwdlst的每个元素都会根据operator<或comp定义的严格弱顺序插入到与其值对应的位置。
相等元素的结果顺序是明确的(即,相等元素保持它们在调用之前的相对顺序,现有元素在从fwdlst插入的相等元素之前)。
☲ 参数
-
fwdlst
-
使用相同分配器的相同类型的forward_list对象(即,具有相同的模板参数,T和Alloc)。
注意,无论传递的是左值还是右值引用,这个函数都会修改fwdlst。
-
comp
-
二元谓词,接受与forward_list中包含的值相同类型的两个值..
如果第一个参数按照它定义的严格弱顺序被认为在第二个参数之前,
则返回true,否则返回false。
这应该是一个函数指针或函数对象。
☉ 返回值
none
☣ 示例
// forward_list::merge
#include <iostream>
#include <forward_list>
#include <functional>
int main ()
{
std::forward_list<double> first = {4.2, 2.9, 3.1};
std::forward_list<double> second = {1.4, 7.7, 3.1};
std::forward_list<double> third = {6.2, 3.7, 7.1};
first.sort();
second.sort();
first.merge(second);
std::cout << "first contains:";
for (double& x: first) std::cout << " " << x;
std::cout << std::endl;
first.sort (std::greater<double>());
third.sort (std::greater<double>());
first.merge (third, std::greater<double>());
std::cout << "first contains:";
for (double& x: first) std::cout << " " << x;
std::cout << std::endl;
return 0;
} |
输出:
first contains: 1.4 2.9 3.1 3.1 4.2 7.7
first contains: 7.7 7.1 6.2 4.2 3.7 3.1 3.1 2.9 1.4
✥ 复杂度
两个容器的大小之和最多是线性的(比较)。
☣ 迭代器的有效性
在调用之前,与容器相关的迭代器、指针和引用没有变化。
指向已转移元素的迭代器、指针和引用继续指向相同的元素,但迭代器现在将迭代到已转移元素所在的容器中。
⇄ 数据竞争
*this容器和fwdlst都被修改.
并发访问或修改它们的元素是安全的,尽管遍历任何一个容器都不安全。
☂ 异常安全性
如果两个容器中的分配器不相等,如果comp没有定义严格的弱排序,
或者容器元素没有按照它排序,则会导致未定义的行为。
否则,如果比较引发异常,则容器将保持有效状态(基本保证)。
否则,如果抛出异常,则容器中没有任何更改(强保证)。
🍄 另请参阅
forward_list::splice_after |
从另一个forward_list转移元素(公众成员函数) |
forward_list::insert_after |
插入元素(公众成员函数) |
forward_list::remove |
删除具有特定值的元素(公众成员函数) |
forward_list::erase_after |
删除元素(公众成员函数) |
forward_list::push_front |
在开头插入元素(公众成员函数) |