c++ - C++ 将所有元素从向量复制到 map / unordered_map 的最佳方法
问题描述
使用 C++,如果我想将 a 转换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的类似复制构造函数不可用?
解决方案
让我们看看你的set
建筑。
vector<int> vec {1, 2, 2, 3, 3, 3, 4, 4, 4, 4}; set<int> s(vec.begin(), vec.end());
这成功了,因为value_type
你的set
is int
。这不仅仅是方便的术语。Astd::set
定义了一个名为的成员类型value_type
,我说的std::set<int>::value_type
是int
。由于取消引用vec.begin()
提供了一个可隐式转换为int
(嗯,它是 int
)的值,因此此构造成功。
移动到map
,再次有一个成员类型称为value_type
. 但是,这一次value_type
不是int
,因此您建议的构造失败。a的value_type
amap
是pair
包含键值对的 a。也就是说,std::map<int, size_t>::value_type
是std::pair<const int, size_t>
。由于没有从int
到 的任何风格的已知转换std::pair
,因此您建议的构造失败。
如果您改为从 a vector
of 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}
的被删除,因为这是 a map
,而不是 a multimap
。(未指定第一个或第二个{4,4}
是否被丢弃,但无论哪个被丢弃都是额外的。)
推荐阅读
- mysql - MYSQL存储过程将多个结果替换为一个参数:结果由多于一行组成
- mysql - 将表从 MySQL 5.7 转移到 8.0,在 blob 列上显示错误数据
- string - 如何构建一个非常健壮的 PLSQL 日期解析函数?
- aws-sam - 错误:无法创建托管资源:无法找到凭据(sam deploy --guided)
- javascript - 如何在运行时访问 JSDoc
- html - 具有 3 种水平颜色的网站正文背景
- npm - npm 和 webpack - 包大小
- flutter - 需要从 Google Places API 中获取评级数字,而不仅仅是星星
- sql - 试图总结 2 个表,其中某些条目在另一个表中不存在
- python - 我怎么能用 BeautifulSoup 分割这个?