假设我有一个可以轻松表达键值语义的类:
template <class T1, class T2>
struct data_t{
T1 m1;
T2 m2;
};
从这种结构的向量中创建无序地图的最有效的方法是什么?
我尝试为我的班级
定义转化运算符operator std::pair<T1, T2> () { return {m1, m2}; } // typo noted by PasserBy
但这似乎不起作用
std::vector<data_t> v;
std::unordered_map<T1, T2> um(v.begin(), v.end()); // compilation error
我的特定用例有一个指针类型T1
和一个值类型T2
所以我想不需要定义哈希函数(?)。我试图通过转换运算符执行此操作的原因是能够以相同的方式向无序映射添加元素:
um.insert(itn, ite); // insert from a range of the source vector
答案 0 :(得分:1)
我只想使用transform:
unordered_map<int, double> um;
transform(begin(v), end(v), inserter(um, end(um)), [](const auto& data) {
return make_pair(data.m1, data.m2);
});
答案 1 :(得分:1)
首先,转换运算符中存在拼写错误
operator std::pair<T1, T2>() const { return {m1, m2}; }
通常也应将其标记为const
。
编译错误的原因是unordered_map<T1, T2>
持有std::pair<const T1, T2>
,您的向量不会保留。
所以这是有效的
std::vector<data_t<const T1, T2>> v;
std::unordered_map<T1, T2> um(v.begin(), v.end());
前提是T1
具有正确的哈希函数。
使用不同的转换运算符
operator std::pair<const T1, T2>() const { return {m1, m2}; }
std::vector<data_t<T1, T2>> v;
std::unordered_map<T1, T2> um(v.begin(), v.end());