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 转换为 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] 【参考方案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_type 的member 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 >),它可以用来初始化一个地图,就像你之前已经做过的那样。

【讨论】:

以上是关于C++ 将所有元素从向量复制到 map / unordered_map 的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

关于将元素插入向量的 C++ 问题

C++ 将元素从一个向量移动到另一个向量

C++:指向向量(及其元素)的指针是不是稳定,因为随着向量的增长,向量将在内存中迁移以适应更多元素? [复制]

如何在 C++ 中将一个对象从一个向量复制到另一个向量?

如何通过将向量元素传递给函数来更改它们

如何清除向量中的所有元素,除了C++中向量中的最后一个元素