# std::multimap<Key,T,Compare,Allocator>::emplace

< cpp‎ | container‎ | multimap

template< class... Args > iterator emplace( Args&&... args ); |  | (C++11 起)

插入以给定的 `args` 原位构造的新元素到容器。

细心地使用 `emplace` 允许在构造新元素的同时避免不必要的复制或移动操作。 准确地以与提供给 `emplace` 者相同的参数，通过 std::forward<Args>(args)... 转发调用新元素（即 std::pair<const Key, T> ）的构造函数。

没有迭代器或引用被非法化。

### 参数

args | - | 要转发给元素构造函数的参数

### 返回值

指向被插入元素的迭代器。

### 异常

若任何操作抛出异常，则此函数无效果。

### 复杂度

与容器大小成对数。

### 示例

    #include <iostream>
    #include <utility>
    #include <string>
    #include <map>

    int main()
    {
        std::multimap<std::string, std::string> m;

        // 使用 pair 的移动构造函数
        m.emplace(std::make_pair(std::string("a"), std::string("a")));

        // 使用 pair 的转换移动构造函数
        m.emplace(std::make_pair("b", "abcd"));

        // 使用 pair 的模板构造函数
        m.emplace("d", "ddd");

        // 使用 pair 的逐片构造函数
        m.emplace(std::piecewise_construct,
                  std::forward_as_tuple("c"),
                  std::forward_as_tuple(10, 'c'));

        for (const auto &p : m) {
            std::cout << p.first << " => " << p.second << '\n';
        }
    }

输出：

    a => a
    b => abcd
    c => cccccccccc
    d => ddd

### 参阅

emplace_hint (C++11) | 使用提示原位构造元素 (公开成员函数)
insert | 插入元素或结点 (C++17 起) (公开成员函数)