从结构向量创建无序映射
Create an unordered map from a vector of structs
假设我有一个 class 可以轻松表达键值语义:
template <class T1, class T2>
struct data_t{
T1 m1;
T2 m2;
};
从此类结构的向量中创建无序映射的最有效的方法是什么?
我的做法
我试图为我的class
定义一个转换运算符
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
我只想使用转换:
unordered_map<int, double> um;
transform(begin(v), end(v), inserter(um, end(um)), [](const auto& data) {
return make_pair(data.m1, data.m2);
});
首先,您的转换运算符有错字
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());
假设我有一个 class 可以轻松表达键值语义:
template <class T1, class T2>
struct data_t{
T1 m1;
T2 m2;
};
从此类结构的向量中创建无序映射的最有效的方法是什么?
我的做法
我试图为我的class
定义一个转换运算符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
我只想使用转换:
unordered_map<int, double> um;
transform(begin(v), end(v), inserter(um, end(um)), [](const auto& data) {
return make_pair(data.m1, data.m2);
});
首先,您的转换运算符有错字
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());