std::map
有序的键值存储
std::map 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。
什么是 std::map
std::map 按键排序存储键值对。每个键都是唯一的,查找、插入和删除的运行时间均为对数级。
- 键始终保持有序。
- 底层采用平衡二叉搜索树。
#include <iostream>
#include <map>
int main() {
std::map<std::string, int> ages;
ages["Alice"] = 30;
ages["Bob"] = 25;
std::cout << "Alice is " << ages["Alice"] << '\n';
return 0;
}插入元素
可以使用 operator[]、insert() 或 emplace() 进行插入。对不存在的键使用 [] 会以默认值创建该键。
#include <iostream>
#include <map>
int main() {
std::map<std::string, int> m;
m["one"] = 1;
m.insert({"two", 2});
m.emplace("three", 3);
std::cout << m.size() << " entries\n";
return 0;
}有序遍历
遍历 std::map 时会按升序访问键。每个元素都是一个 std::pair,其中 .first 表示键,.second 表示值。
#include <iostream>
#include <map>
int main() {
std::map<std::string, int> m{{"banana", 3}, {"apple", 5}, {"cherry", 1}};
for (const auto& p : m) {
std::cout << p.first << " = " << p.second << '\n';
}
return 0;
}查找键
使用 find() 可以安全地查找键。找到时它会返回指向该元素的迭代器,否则返回 end()。
#include <iostream>
#include <map>
int main() {
std::map<std::string, int> m{{"x", 10}, {"y", 20}};
auto it = m.find("y");
if (it != m.end()) {
std::cout << "Found y = " << it->second << '\n';
} else {
std::cout << "Not found\n";
}
return 0;
}检查是否存在
若要测试某个键是否存在而不创建它,请使用 count()(返回 0 或 1),或在 C++20 中使用 contains()。
#include <iostream>
#include <map>
int main() {
std::map<std::string, int> m{{"a", 1}};
std::cout << m.count("a") << '\n';
std::cout << m.count("z") << '\n';
return 0;
}更新值
重新为某个键赋值会直接更新其值。该 map 每个键只保留一个值。
#include <iostream>
#include <map>
int main() {
std::map<std::string, int> score;
score["player"] = 10;
score["player"] += 5;
std::cout << score["player"] << '\n';
return 0;
}删除元素
erase() 可以按键或迭代器删除元素。按键调用时,它会返回被删除的元素数量。
#include <iostream>
#include <map>
int main() {
std::map<std::string, int> m{{"a", 1}, {"b", 2}, {"c", 3}};
m.erase("b");
std::cout << m.size() << " left\n";
for (const auto& p : m) std::cout << p.first << ' ';
std::cout << '\n';
return 0;
}使用 at()
at() 返回某个键对应值的引用;如果键不存在,则抛出 std::out_of_range。与 [] 不同,它绝不会插入元素。
#include <iostream>
#include <map>
int main() {
std::map<std::string, int> m{{"k", 42}};
std::cout << m.at("k") << '\n';
std::cout << "size: " << m.size() << '\n';
return 0;
}统计单词频率
std::map 的一个经典用途是统计出现次数。[] 运算符会将新键默认初始化为 0,因此直接使用 ++ 即可。
#include <iostream>
#include <map>
#include <string>
int main() {
std::string words[] = {"cat", "dog", "cat", "bird", "dog", "cat"};
std::map<std::string, int> freq;
for (const auto& w : words) freq[w]++;
for (const auto& p : freq) std::cout << p.first << ": " << p.second << '\n';
return 0;
}结构化绑定
C++17 允许使用结构化绑定拆解每个键值对,为键和值提供易读的名称。
#include <iostream>
#include <map>
int main() {
std::map<std::string, int> m{{"red", 1}, {"green", 2}};
for (const auto& [name, value] : m) {
std::cout << name << " -> " << value << '\n';
}
return 0;
}检查是否为空
empty() 报告 map 是否不包含任何元素,而 clear() 会一次性删除所有元素。
#include <iostream>
#include <map>
int main() {
std::map<int, int> m{{1, 1}, {2, 4}};
std::cout << std::boolalpha << m.empty() << '\n';
m.clear();
std::cout << m.empty() << '\n';
return 0;
}快速检查
测试您对 std::map 排序方式的理解。
回顾
您学习了 std::map:
- 存储映射到值的唯一有序键
- 支持
insert、[]、find、count、at和erase - 按键的升序遍历,并可通过结构化绑定拆解其中的键值对
接下来,您将学习用于存储有序唯一值的 std::set。
常见问题解答
「std::map」课时是免费的吗?
是的 — 「std::map」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。
「std::map」这节课中我会学到什么?
有序的键值存储 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C++ Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「std::map」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C++ Academy 课中编写并运行代码吗?
能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。