从结构向量创建无序映射

时间:2017-06-06 09:22:19

标签: c++ unordered-map

假设我有一个可以轻松表达键值语义的类:

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

2 个答案:

答案 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());