如何用fixed元素直接初始化unordered_map?
How to initialize unordered_map directly with fixed element?
我想用固定元素 100 初始化一个 unordered_map
。keys
从 0
到 100
,这些键的所有值都是 0
using HashMap = unordered_map < int, int > ;
HashMap map;
for (int idx = 0; idx < 100; ++idx) {
map[idx] = 0;
}
问题一:
有没有像python
中的以下代码那样直接做到这一点的方法?
d = {x: x % 2 == 0 for x in range(1, 11)}
问题二:
上面的初始化代码,我认为所有元素都是按升序排列的,但结果是:
为什么第一个元素是8
,第二个元素是64
,左边的元素都是升序的?
这不像 Python 表达式那么漂亮,但它应该可以解决问题。
#include <algorithm>
#include <iostream>
#include <iterator>
#include <unordered_map>
int main() {
std::unordered_map<int, bool> m;
int i = -1;
std::generate_n(std::inserter(m, m.begin()),
10,
[&i](){
++i;
return std::make_pair(i, i % 2 == 0);
});
for (auto const &p: m)
std::cout << '<' << p.first << ", " << p.second << ">\n";
return 0;
}
生活在 ideone.com
无序地图被称为无序地图是有原因的。由于它们是作为散列映射实现的,因此键没有任何可预测的顺序。将 std::unordered_map 用于整数键的密集集合可能不是解决任何问题的最有效方法,特别是如果您希望能够按顺序提取键。
考虑boost::irange
无序映射的内部数据结构是hash table,它在散列过程中并不总是保持键顺序。
我想用固定元素 100 初始化一个 unordered_map
。keys
从 0
到 100
,这些键的所有值都是 0
using HashMap = unordered_map < int, int > ;
HashMap map;
for (int idx = 0; idx < 100; ++idx) {
map[idx] = 0;
}
问题一:
有没有像python
中的以下代码那样直接做到这一点的方法?
d = {x: x % 2 == 0 for x in range(1, 11)}
问题二:
上面的初始化代码,我认为所有元素都是按升序排列的,但结果是:
为什么第一个元素是8
,第二个元素是64
,左边的元素都是升序的?
这不像 Python 表达式那么漂亮,但它应该可以解决问题。
#include <algorithm> #include <iostream> #include <iterator> #include <unordered_map> int main() { std::unordered_map<int, bool> m; int i = -1; std::generate_n(std::inserter(m, m.begin()), 10, [&i](){ ++i; return std::make_pair(i, i % 2 == 0); }); for (auto const &p: m) std::cout << '<' << p.first << ", " << p.second << ">\n"; return 0; }
生活在 ideone.com
无序地图被称为无序地图是有原因的。由于它们是作为散列映射实现的,因此键没有任何可预测的顺序。将 std::unordered_map 用于整数键的密集集合可能不是解决任何问题的最有效方法,特别是如果您希望能够按顺序提取键。
考虑
boost::irange
无序映射的内部数据结构是hash table,它在散列过程中并不总是保持键顺序。