【问题标题】:How to initialize an empty unordered map in C++?如何在 C++ 中初始化一个空的无序映射?
【发布时间】:2020-07-22 09:44:53
【问题描述】:

我必须在 C++ 中的无序映射上运行一个循环(在 t 上循环),每次运行循环时,无序映射都会更新。但我想做的是,每次运行循环时都从一个空地图开始。如何初始化一个空的无序地图?

while (t--){
        unordered_map<int, int> freq;
        //perform  various insertions and deletions in the map
        //print all the elements in the map
        }

【问题讨论】:

  • 在您发布的代码中,您已经从一张空地图开始。每当你添加一个 key 元素时,它的 value 元素都会被初始化,对于 int 值意味着它们将被设置为 0。
  • 无处不在的lambdas

标签: c++ dictionary data-structures unordered-map


【解决方案1】:

无序地图有点棘手,因为它们使用了两个东西:

  1. {key,value} 对链(STL 使用std::forward_list)。
  2. 链元素的位置数组(哈希表)。

当您将元素插入地图时,数组会被填满(负载因子增加)并且哈希冲突开始变得频繁。这最终导致该数组被调整大小,并且其所有元素(对链的位置)被重新创建(这称为重新散列)。

话虽如此,您的代码完全符合您的要求:声明std::unordered_map&lt;int,int&gt; 类型的变量默认初始化它。当程序循环返回时,映射在下一次迭代之前超出范围(调用析构函数),并在新迭代开始时初始化一个新变量。

但是,您可以考虑使用另一种替代方法:改为在循环开始时调用 clear(),并在循环外声明您的地图:

std::unordered_map<int, int> freq;
while (t--) {
   freq.clear();
   // do something with freq
}

如果所有迭代都相似(您在freq 中引入了相似数量的对),第一次迭代将找到散列表的适当大小(重新散列),但随后迭代不会经常看到这种效果:在clear() 期间,我们删除了所有链的元素,但我们保留了数组,它将在整个循环中重复使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2019-01-28
    • 2012-02-02
    • 2011-02-07
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多