C++ 将所有元素从向量复制到 map / unordered_map 的最佳方法
Posted
技术标签:
【中文标题】C++ 将所有元素从向量复制到 map / unordered_map 的最佳方法【英文标题】:C++ best way to copy all elements from vector into map / unordered_map 【发布时间】:2020-06-05 15:40:17 【问题描述】:使用 C++,如果我想将 vector
转换为 set
或 unordered_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;
但是,相同的技术不适用于 map
或 unordered_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<int, size_t> uMap(vec.begin(), vec.end());
完成什么?该行表示要构建从int
到size_t
的映射,但您没有提供任何size_t
s。如果该构造可行,您期望的价值是多少,比如说uMap[3]
?
【参考方案1】:
让我们看看你的set
构造。
vector<int> vec 1, 2, 2, 3, 3, 3, 4, 4, 4, 4; set<int> s(vec.begin(), vec.end());
这会成功,因为您的set
的value_type
是int
。这不仅仅是方便的术语。一个std::set
定义了一个名为value_type
的member type,我说std::set<int>::value_type
是int
。由于取消引用 vec.begin()
提供了一个可隐式转换为 int
的值(嗯,它是 int
),因此此构造成功。
转到map
,又有一个member type,称为value_type
。不过,这一次,value_type
不是int
,因此您建议的构造失败。 map
的 value_type
是包含键值对的 pair
。也就是说,std::map<int, size_t>::value_type
是 std::pair<const int, size_t>
。由于没有从 int
到任何风格的 std::pair
的已知转换,因此您建议的构造失败。
如果您改为使用 vector
或 pair
s,您的构造可能会成功。
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] == 2
、m[2] == 3
、m[3] == 3
和 m[4] == 4
。多余的4,4
被删除,因为这是map
,而不是multimap
。 (未指定第一个或第二个4,4
是否被丢弃,但以丢弃者为准。)
【讨论】:
感谢@JaMiT。那么我们可以得出结论,使用unordered_map
或map
从向量中计算元素的频率是使用for
循环吗?有时我只是想探索奇特的方式......【参考方案2】:
一个映射条目有两个“值”,而一个向量只有一个。 如果要将矢量元素插入到地图中,则需要确定哪个 值将成为键,哪些将成为值。 这样做的方法是使用成对的向量(vector >),它可以用来初始化一个地图,就像你之前已经做过的那样。
【讨论】:
以上是关于C++ 将所有元素从向量复制到 map / unordered_map 的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章