【问题标题】:how could I initialize unordered_map< vector<int> >?如何初始化 unordered_map<vector<int>>?
【发布时间】:2014-07-24 08:49:26
【问题描述】:

我在工作中遇到了一个问题

在我的 c++ 类中,vector&lt;int&gt; 上有一个 unordered_map
像这样unordered_map &lt; int, vector&lt;int&gt; &gt;

那么我如何初始化嵌套容器,以便在我向哈希表插入键时 并且值(向量)将是十个零?

【问题讨论】:

  • 地图的关键是什么?
  • @JoachimPileborg 抱歉,关键是 int
  • 您希望map[key] 返回一个vector&lt;int&gt;,并在没有为该键插入其他任何内容的情况下初始化为 10 0,就这样?
  • @Johan 是的,这样我就可以像这样使用hash[1][2]++
  • @Shanicky_C 向量会增长到 10 个元素吗?

标签: c++ vector constructor stl unordered-map


【解决方案1】:

可以使用列表初始化:

std::unordered_map<int, std::vector<int>> m
  { { 2, std::vector<int>(10, 0) }
  , { 5, std::vector<int>(10, 0) }
  , { 6, std::vector<int>(10, 0) }
  , { 9, std::vector<int>(10, 0) }
  };

【讨论】:

  • 非常感谢,但我只是想初始化,以便在将键插入哈希表时,向量将自动为零 10
  • @Shanicky_C:嗯,你永远不能只“插入一个键”,所以这个问题没有任何意义:你总是插入一个完整的 value,它是一对键和映射元素。
【解决方案2】:

很简单:

std::unordered_map<int, std::vector<int>> my_map;

my_map[123] = std::vector<int>{1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };

现在my_map 将包含一个条目,键123 和数据是一个包含十个条目的向量。

【讨论】:

【解决方案3】:

不允许用户直接访问地图,让他们通过访问器,这样您就可以确保矢量以您想要的方式填充:

class FooBar
{
public:
  // access the map
  std::vector<int>& operator[](int n);

private:
  std::unordered_map<int, std::vector<int>> map;
};

std::vector<int>& FooBar::operator[](int n)
{
  auto iter = map.find(n);
  if (iter == map.end()) // index not found, so insert it
    iter = map.emplace(n, std::vector<int>(10, 0)).first;
  return *iter;
}

【讨论】:

    【解决方案4】:

    根据您在 cmets 中的说明,您需要一个固定大小的数组。 这里是一个小例子:

    #include <array>
    #include <unordered_map>
    #include <iostream>
    
    int main(int, char const *[])
    {
        std::unordered_map<int, std::array<int, 10>> the_map;
    
        std::cout << the_map[0][1] << std::endl;
        the_map[0][2]++;
        std::cout << the_map[0][2] << std::endl;
        return 0;
    }
    

    输出将是:

    0
    1
    

    如果您想更改默认值,您可以执行以下操作:

    struct my_array : public std::array<int, 10> { my_array() { fill(2); }  };
    
    int main(int , char const *[])
    {
        std::unordered_map<int, my_array> the_map;
    
        std::cout << the_map[0][1] << std::endl;
        the_map[0][2]++;
        std::cout << the_map[0][2] << std::endl;
        return 0;
    }
    

    输出:

    2
    3
    

    不是我最喜欢的选择,但你可以这样做。

    【讨论】:

    • @Shanicky_C 什么是“10 二”?
    • {2,2,2,2,2,2,2,2,2,2}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    相关资源
    最近更新 更多