0Pricing
C++ Academy · 课时

std::unordered_map

基于哈希的快速查找

std::unordered_map 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。

什么是无序映射

std::unordered_map 会将键值对存储在哈希表中。查找、插入和删除的平均时间复杂度为常数级,但元素没有排序顺序。

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> ages;
    ages["Alice"] = 30;
    ages["Bob"] = 25;
    std::cout << ages["Alice"] << '\n';
    return 0;
}

映射与无序映射

请根据需求进行选择:

  • map:有序,操作复杂度为 O(log n)。
  • unordered_map:无序,平均操作复杂度为 O(1)。

如果只需要快速查找,请使用无序映射。

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<int, std::string> m{{3, "c"}, {1, "a"}, {2, "b"}};
    std::cout << m.size() << " entries (order not guaranteed)\n";
    return 0;
}

插入与更新

它提供与 map 相同的接口:可以使用 []、insert() 或 emplace()。

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> m;
    m["x"] = 1;
    m.insert({"y", 2});
    m.emplace("z", 3);
    std::cout << m.size() << '\n';
    return 0;
}

使用 find 查找

find() 会返回一个迭代器或 end()。这样可以避免像使用 [] 那样意外插入默认值。

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> m{{"a", 1}};
    auto it = m.find("a");
    if (it != m.end()) std::cout << it->second << '\n';
    std::cout << "size: " << m.size() << '\n';
    return 0;
}

检查是否存在

count() 会返回 0 或 1,而 C++20 增加了 contains(),用于进行清晰的布尔检查。

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> m{{"key", 99}};
    std::cout << m.count("key") << '\n';
    std::cout << m.count("missing") << '\n';
    return 0;
}

遍历

您可以进行遍历,但顺序未指定。请不要依赖元素按排序顺序或插入顺序排列。

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> m{{"a", 1}, {"b", 2}, {"c", 3}};
    int total = 0;
    for (const auto& [k, v] : m) total += v;
    std::cout << "sum = " << total << '\n';
    return 0;
}

删除

erase() 会根据键删除元素,并返回删除的元素数量。

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> m{{"a", 1}, {"b", 2}};
    m.erase("a");
    std::cout << m.count("a") << ' ' << m.size() << '\n';
    return 0;
}

快速统计频率

对于不需要顺序的大型数据集,无序映射统计频率的速度比 map 更快。

#include <iostream>
#include <unordered_map>
#include <string>

int main() {
    std::string items[] = {"a", "b", "a", "c", "b", "a"};
    std::unordered_map<std::string, int> freq;
    for (const auto& s : items) freq[s]++;
    std::cout << "a appears " << freq["a"] << " times\n";
    return 0;
}

使用 at()

at() 会返回一个引用;如果键不存在,则抛出 std::out_of_range,并且绝不会插入元素。

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> m{{"score", 42}};
    std::cout << m.at("score") << '\n';
    return 0;
}

通过 [] 默认插入

使用 [] 访问不存在的键时,会为该键插入一个经过值初始化的值(对于整数为 0)。请注意,这会让映射在不易察觉的情况下增大。

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> m;
    std::cout << m["new"] << '\n';
    std::cout << "size: " << m.size() << '\n';
    return 0;
}

清空映射

clear() 会清空哈希表,而 empty() 会报告其中是否没有元素。

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<int, int> m{{1, 1}, {2, 2}};
    m.clear();
    std::cout << std::boolalpha << m.empty() << '\n';
    return 0;
}

快速检查

请测试您对无序映射排序顺序的理解。

总结

您已经学会,std::unordered_map:

  • 使用哈希表,平均操作复杂度为 O(1)
  • 不保证顺序
  • 提供与 map 相同的接口(find、count、at、erase)

接下来,您将了解用于快速存储唯一元素的 unordered_set。

常见问题解答

「std::unordered_map」课时是免费的吗?

是的 — 「std::unordered_map」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。

「std::unordered_map」这节课中我会学到什么?

基于哈希的快速查找 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C++ Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「std::unordered_map」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C++ Academy 课中编写并运行代码吗?

能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. std::unordered_map
  2. unordered_set
  3. 自定义哈希函数
  4. 性能考量
← 返回 C++ Academy