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。
如果 *this 或 other 未按相应的比较器排序,或者 get_allocator() != other.get_allocator(),则行为未定义。
内容 |
[编辑] 参数
other | - | 另一个要合并的容器 |
comp | - | 比较函数对象(即满足 Compare 要求的对象),如果第一个参数小于(即在排序中位于第二个参数之前),则返回true。 比较函数的签名应等效于以下内容 bool cmp(const Type1& a, const Type2& b); 虽然签名不需要具有 const&,但函数不得修改传递给它的对象,并且必须能够接受类型(可能是 const) |
类型要求 | ||
-Compare 必须满足 Compare 的要求。 |
[编辑] 返回值
(无)
[编辑] 异常
如果由于任何原因抛出异常,这些函数不会产生任何影响 (强异常安全保证)。除非异常来自比较。
[编辑] 复杂度
如果 other 指向与 *this 相同的对象,则不会执行任何比较。
否则,给定 N 为 std::distance(begin(), end()),R 为 std::distance(other.begin(), other.end())
[编辑] 示例
#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 | 如果 get_allocator() != other.get_allocator() |
则无法保证 O(1) 节点移动 在这种情况下,行为是未定义的 |
LWG 3088 | C++98 | operator< 可能会对指针元素表现不正常 | 实现定义的 使用严格的总排序 |
[编辑] 参见
从另一个 list 中移动元素(公共成员函数) | |
合并两个排序范围 (函数模板) | |
在原地合并两个排序范围 (函数模板) | |
(C++20) |
合并两个排序范围 (niebloid) |
(C++20) |
在原地合并两个排序范围 (niebloid) |