创建地图元素时避免使用值复制

P45*_*ent 2 c++

我有一个std::map<std::string, std::vector<double>> foo,我使用一个函数慢慢建立的内容

bar(
    std::string key   /*key name*/,
    std::size_t index /*element index of the vector*/,
    double value      /*value to put in the vector at that index*/
)
Run Code Online (Sandbox Code Playgroud)

这个函数foo以一种我信任的方式填充,从函数参数类型和那些简短的注释中可以看出.

但是,我担心当我添加一个新密钥时会发生这种情况

auto it = foo.find(index);
if (it == foo.end()){
   /*ToDo - avoid taking a vector value copy*/
Run Code Online (Sandbox Code Playgroud)

我最终创建了一个新的std::vector<double>,并把它放在地图中.这导致我获取该向量的值副本.有没有办法(除了使用智能指针作为地图值)这样做而不需要复制值?

Bat*_*eba 5

自C++ 11以来有一个很好的方法(根据你的使用auto,你正在使用它).该标准允许称为安置的特殊类型的插入.最简单的方法就是使用它

it = foo.emplace(
    std::make_pair(key, std::vector<double>(1 + index, 0.0/*a default value*/))
).first;
Run Code Online (Sandbox Code Playgroud)

然后调用it->second.at(index) = value它的东西,你可能会做无论如何,如果find 返回的元素.

进驻技术正在利用匿名临时std::vector和匿名临时的移动构造函数std::pair.(那些临时的人被称为r值参考).

有关详细信息,请参阅http://en.cppreference.com/w/cpp/container/map/emplace