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

时间:2015-07-10 06:27:57

标签: c++ c++11 unordered-map

我想用固定元素100初始化一个unordered_mapkeys来自0100,这些键的所有值都是0

using HashMap = unordered_map < int, int > ;

HashMap map;
for (int idx = 0; idx < 100; ++idx) {
    map[idx] = 0;
}

问题1:

有没有直接的方法可以像python中的以下代码那样做?

d = {x: x % 2 == 0 for x in range(1, 11)}

问题2:

使用上面的初始化代码,我认为所有元素都按升序排序,但结果是:

enter image description here

为什么第一个元素是8而第二个元素是64,所有左边元素都按升序排列?

2 个答案:

答案 0 :(得分:2)

  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 :(得分:0)

  1. 考虑boost::irange

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