如何用fixed元素直接初始化unordered_map?

How to initialize unordered_map directly with fixed element?

我想用固定元素 100 初始化一个 unordered_mapkeys0100,这些键的所有值都是 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,左边的元素都是升序的?

  1. 这不像 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

  2. 无序地图被称为无序地图是有原因的。由于它们是作为散列映射实现的,因此键没有任何可预测的顺序。将 std::unordered_map 用于整数键的密集集合可能不是解决任何问题的最有效方法,特别是如果您希望能够按顺序提取键。

  1. 考虑boost::irange

  2. 无序映射的内部数据结构是hash table,它在散列过程中并不总是保持键顺序。