【问题标题】:C++ best way to copy all elements from vector into map / unordered_mapC++ 将所有元素从向量复制到 map / unordered_map 的最佳方法
【发布时间】:2020-06-05 15:40:17
【问题描述】:

使用 C++,如果我想将 vector 转换为 setunordered_set 容器,可以通过以下方式轻松完成:

#include <iostream>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <vector>
using namespace std;

int main() {
    vector<int> vec {1, 2, 2, 3, 3, 3, 4, 4, 4, 4};

    // pass
    unordered_set<int> uSet(vec.begin(), vec.end());
    // pass
    set<int> s(vec.begin(), vec.end());
    // fail
    unordered_map<int, size_t> uMap(vec.begin(), vec.end());
    // fail
    map<int, size_t> m(vec.begin(), vec.end());

    return 0;
}

但是,相同的技术不适用于 mapunordered_map 容器。我想知道是否有更好的方法将向量中的所有元素存储到 map / unordered_map 容器中,而不是:

for (int ele : vec) {
    ++uMap[ele];
}

另外,下面的代码调用了来自https://en.cppreference.com/w/cpp/container/unordered_set/unordered_set 的复制构造函数:

set<int> s(vec.begin(), vec.end()); 

为什么没有来自https://en.cppreference.com/w/cpp/container/unordered_map/unordered_map 的类似复制构造函数?

【问题讨论】:

  • 每个问题回答一个问题
  • map 应该如何猜测你想要的值类型?
  • 我相信您无关问题的答案是(2)和(2)。除此之外,我们可以专注于您的主要问题:您希望 unordered_map&lt;int, size_t&gt; uMap(vec.begin(), vec.end()); 完成什么?该行表示要构建从intsize_t 的映射,但您没有提供任何size_ts。如果该构造可行,您期望的价值是多少,比如说uMap[3]

标签: c++ set unordered-map unordered-set


【解决方案1】:

让我们看看你的set 构造。

vector<int> vec {1, 2, 2, 3, 3, 3, 4, 4, 4, 4};

set<int> s(vec.begin(), vec.end());

这会成功,因为您的setvalue_typeint。这不仅仅是方便的术语。一个std::set 定义了一个名为value_typemember type,我说std::set&lt;int&gt;::value_typeint。由于取消引用 vec.begin() 提供了一个可隐式转换为 int 的值(嗯,它 int),因此此构造成功。

转到map,又有一个member type,称为value_type。不过,这一次,value_type 不是int,因此您建议的构造失败。 mapvalue_type 是包含键值对的 pair。也就是说,std::map&lt;int, size_t&gt;::value_typestd::pair&lt;const int, size_t&gt;。由于没有从 int 到任何风格的 std::pair 的已知转换,因此您建议的构造失败。

如果您改为使用 vectorpairs,您的构造可能会成功。

vector<pair<const int, size_t>> vecp { {1, 2}, {2, 3}, {3, 3}, {4, 4}, {4, 4} };

map<int, size_t> m(vecp.begin(), vecp.end());

这会导致 m[1] == 2m[2] == 3m[3] == 3m[4] == 4。多余的{4,4} 被删除,因为这是map,而不是multimap。 (未指定第一个或第二个{4,4} 是否被丢弃,但以丢弃者为准。)

【讨论】:

  • 感谢@JaMiT。那么我们可以得出结论,使用unordered_mapmap 从向量中计算元素的频率是使用for 循环吗?有时我只是想探索奇特的方式......
【解决方案2】:

一个映射条目有两个“值”,而一个向量只有一个。 如果要将矢量元素插入到地图中,则需要确定哪个 值将成为键,哪些将成为值。 这样做的方法是使用成对的向量(vector >),它可以用来初始化一个地图,就像你之前已经做过的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-11
    • 2017-05-25
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 2016-02-18
    相关资源
    最近更新 更多