如何在C++的std::map中使用带转发参数的emplace方法?
解决std::map中emplace方法的参数错误问题
错误原因
std::map的元素类型是std::pair<const int, Complicated>,调用emplace时传入的参数需要能直接构造这个pair对象。你原代码中m.emplace(4,anInt,aDouble,aString)的写法,试图用4个参数构造pair,但std::pair没有匹配的构造函数,因此编译报错。
两种解决方法
方法1:使用std::piecewise_construct(推荐,避免临时对象)
通过std::piecewise_construct和std::forward_as_tuple,分别为pair的first(键)和second(值)传递构造参数,实现完全就地构造:
#include<iostream> #include<map> #include <string> #include <utility> #include <vector> using namespace std; struct Complicated { int i; double d; string s; Complicated(int a, double b, std::string c): i{a}, d{b}, s{c}{}; }; int main() { std::map<int, Complicated> m; int anInt = 4; double aDouble = 5.0; std::string aString = "C++"; m.emplace( std::piecewise_construct, std::forward_as_tuple(4), // 构造pair的first(const int) std::forward_as_tuple(anInt, aDouble, aString) // 构造pair的second(Complicated) ); return 0; }
方法2:显式构造std::pair传入
直接构造pair对象并传入emplace,这种方式会创建Complicated临时对象,适合简单场景:
// 简化写法(C++11及以上) m.emplace(std::make_pair(4, Complicated(anInt, aDouble, aString))); // 更严谨的写法 m.emplace(std::pair<const int, Complicated>(4, Complicated(anInt, aDouble, aString)));
对比std::vector的emplace_back
std::vector的元素是Complicated本身,所以emplace_back的参数可以直接用于构造Complicated对象;而std::map的元素是pair类型,必须明确告知如何构造pair的两个成员,这就是两者用法差异的核心原因。
内容的提问来源于stack exchange,提问作者roschach
相关产品推荐
相关产品推荐

