我有一个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>,并把它放在地图中.这导致我获取该向量的值副本.有没有办法(除了使用智能指针作为地图值)这样做而不需要复制值?
自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