【问题标题】:Create an unordered map from a vector of structs从结构向量创建无序映射
【发布时间】:2023-03-18 08:24:01
【问题描述】:

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

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

【问题讨论】:

    标签: c++ unordered-map


    【解决方案1】:

    我只会使用变换:

    unordered_map<int, double> um;
    transform(begin(v), end(v), inserter(um, end(um)), [](const auto& data) {
        return make_pair(data.m1, data.m2);
    });
    

    【讨论】:

      【解决方案2】:

      首先,您的转换运算符中有一个错字

      operator std::pair<T1, T2>() const { return {m1, m2}; }
      

      通常也应该标记为const。

      编译错误的原因是unordered_map&lt;T1, T2&gt; 持有std::pair&lt;const T1, T2&gt;,而您的向量不持有。

      所以这行得通

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-26
        • 2011-02-09
        • 2015-06-26
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多