emplace 

emplace操作是从C++11开始引入新特性,emplace操作是直接通过参数构造元素而不是拷贝元素到容器中这样可以减少拷贝从而提高性能。对于map是没有emplace_front、emplace_after、emplace_back这些操作的。

std::map<Key,T,Compare,Allocator>::emplace

template< class... Args >
std::pair<iterator,bool> emplace( Args&&... args );

(since C++11)

Inserts a new element into the container constructed in-place with the given args if there is no element with the key in the container.

注意返回值也是一个std::pair

#include <iostream>
#include <utility>
#include <string>
#include <map>
 
int main()
{
    std::map<std::string, std::string> m;
 
    // uses pair's move constructor
    //使用移动构造
    m.emplace(std::make_pair(std::string("a"), std::string("a")));
 
    // uses pair's converting move constructor
    //使用隐式转换移动构造函数,和上一个区别是这里的“a”会隐式转换成std::string
    m.emplace(std::make_pair("b", "abcd"));
 
    // uses pair's template constructor
    //使用模板构造
    m.emplace("d", "ddd");
 
    // uses pair's piecewise constructor
    m.emplace(std::piecewise_construct,
              std::forward_as_tuple("c"),
              std::forward_as_tuple(10, 'c'));
    // as of C++17, m.try_emplace("c", 10, 'c'); can be used
 
    for (const auto &p : m) {
        std::cout << p.first << " => " << p.second << '\n';
    }
}

输出:

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

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐