为什么unordered_map采用两个值?

时间:2017-06-08 15:56:18

标签: c++ unordered-map

我只是没有得到它 - 为什么这会初始化一个2参数值?

我知道那里有钥匙和价值......但我是否需要每次都专门给出钥匙?这不具备内部散列函数吗?

我有一个问题:"给定2个数组,找到常用数字+不同数字"。很简单。虽然我的问题实际上是实现了STL容器" unordered_map"因为我无法找到任何明确解释为什么它需要两个参数的东西。

我想要的是什么?做:

unordered_map<int, int> hash;

这样的事情让你可以得到要点。只是不确定为什么有两个值,如:

count_animals_in_area = fn (area, acc) ->
  acc = case Map.has_key?(area, "duck") do
          true ->
            Map.put(acc, "ducks", (acc["ducks"] + area["duck"]))
          false ->
            acc
        end

  acc = case Map.has_key?(area, "goose") do
          true ->
            Map.put(acc, "geese", (acc["geese"] + area["goose"]))
          false ->
            acc
        end

  acc = case Map.has_key?(area, "cat") do
          true -> 
            Map.put(acc, "cats", (acc["cats"] + area["cat"]))
          false ->
            acc
        end

  acc
end

count_animals_in_areas = fn(areas) ->
  acc = %{ "ducks" => 0,
           "geese" => 0,
           "cats" => 0 }
  IO.inspect Enum.reduce areas, acc, count_animals_in_area
end

t1 = [ %{"duck" => 3, "goose" => 4, "cat" => 1},
       %{"duck" => 7, "goose" => 2},
       %{"goose" => 12}]

IO.puts "JEA: begin"
count_animals_in_areas.(t1)
IO.puts "JEA: end"

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

  

[...]但我是否需要每次都专门给出密钥?

是的!这就是地图的意义所在。如果您不关心密钥,那么您可能不想要地图,只需std::setstd::unordered_set

答案 1 :(得分:1)

正如其他人所说,地图并不是你真正想要的。

他们所建议的是一个集合(或unordered_set)。

至少IMO,这也有点有问题。它显然更适合,考虑到情况(你想要两个列表,找到它们包含的数字,然后找到交集/差异)你可能是最好将数字放入向量,然后使用sortunique删除重复项。如果您需要执行插入和删除以及维护唯一性,setunordered_set通常会更好。当/如果您可以存储所有数据,然后对其进行排序,然后确保唯一性时,向量往往会更好地工作 - 一旦您完成了该操作,您就不需要再次修改该列表。

最后,您还应该注意std::set_intersectionstd::set_difference(或可能std::set_symmetric_difference)。这些将采取一组已排序的输入(但必然存储在std::set中)并找到(显然足够)两个数字列表之间的交集和差异 - 确切地说你的结果显然需要什么。