# std::multiset<Key,Compare,Allocator>::merge

< cpp‎ | container‎ | multiset

template<class C2> void merge( std::set<Key, C2, Allocator>& source ); | (1) | (C++17 起)
template<class C2> void merge( std::set<Key, C2, Allocator>&& source ); | (2) | (C++17 起)
template<class C2> void merge( std::multiset<Key, C2, Allocator>& source ); | (3) | (C++17 起)
template<class C2> void merge( std::multiset<Key, C2, Allocator>&& source ); | (4) | (C++17 起)

试图提取（“接合”） `source` 中每个元素，并用 `*this` 的比较对象插入到 `*this` 。

不复制或移动元素，只会重指向容器结点的内部指针。指向被转移元素的所有指针和引用保持合法，但现在指代到 `*this` 中而非到 `source` 中。

若 get_allocator() != source.get_allocator() 则行为未定义。

### 参数

source | - | 传递结点来源的兼容容器

### 返回值

（无）

### 异常

不抛异常，除非比较抛出。

### 复杂度

N*log(size()+N)) ，其中 N 为 `source.size()` 。

### 示例

    #include <iostream>
    #include <set>

    // 打印出容器
    template <class Os, class K>
    Os& operator<<(Os& os, const std::multiset<K>& v) {
        os << '[' << v.size() << "] {";
        bool o{};
        for (const auto& e : v)
            os << (o ? ", " : (o = 1, " ")) << e;
        return os << " }\n";
    }

    int main()
    {
        std::multiset<char>
            p{ 'C', 'B', 'B', 'A' },
            q{ 'E', 'D', 'E', 'C' };

        std::cout << "p: " << p << "q: " << q;

        p.merge(q);

        std::cout << "p.merge(q);\n" << "p: " << p << "q: " << q;
    }

输出：

    p: [4] { A, B, B, C }
    q: [4] { C, D, E, E }
    p.merge(q);
    p: [8] { A, B, B, C, C, D, E, E }
    q: [0] { }

### 参阅

extract (C++17) | 从另一容器释出结点 (公开成员函数)
insert | 插入元素或结点 (C++17 起) (公开成员函数)