std::map的基本用法

std::map 是标准模板库(STL)提供的关联容器,底层基于红黑树实现,存储的是键值对(key-value),并按照键的升序自动排序。由于其有序性,std::map 适合需要按键排序或范围查询的场景。

一、头文件与命名空间

使用 std::map 需包含头文件 ,并位于 std 命名空间中:

#include <map>
using namespace std; // 或显式使用 std::map

二、基本定义与初始化

std::map 是模板类,需指定键类型(Key) 和值类型(Value)。

2.1 定义方式

// 定义一个键为 int、值为 string 的 map(默认按 key 升序)
map<int, string> myMap;

// 定义时初始化(C++11 及以上)
map<int, string> myMap = {{1, "apple"}, {2, "banana"}, {3, "cherry"}};

2.2 键的特性

  • 键(Key)必须可比较(需支持 < 运算符,或自定义比较器)。
  • 键唯一,若插入重复键,会覆盖原有值(或忽略,取决于插入方式)。

三、核心接口函数

3.1 插入键值对 ( insert / operator[] )

  • operator[]:最常用,若键不存在则插入,存在则更新值。
  • insert:插入键值对,若键已存在则不更新,返回插入结果。
// 1. 使用 operator[] 插入/更新
myMap[1] = "apple";   // 插入 {1, "apple"}
myMap[2] = "banana";  // 插入 {2, "banana"}
myMap[1] = "apricot"; // 更新键 1 的值为 "apricot"

// 2. 使用 insert 插入(返回 pair<迭代器, bool>,bool 表示是否插入成功)
auto res = myMap.insert({3, "cherry"}); 
if (res.second) 
{
    cout << "插入成功" << endl; // 键 3 不存在,插入成功
} 
else 
{
    cout << "键已存在" << endl; // 键 3 已存在,不更新
}

// 3. 插入范围(从其他 map 或容器)
map<int, string> otherMap = {{4, "date"}, {5, "elderberry"}};
myMap.insert(otherMap.begin(), otherMap.end()); // 插入 otherMap 的所有键值对

//insert 的其他用法
map<unsigned int,double> InfoMap;
unsigned int a = 10;
double b = 20;
InfoMap.insert(pair<unsigned int,double>(a,b));

3.2 查找键(find / count)

  • find(key):返回指向键值对的迭代器,若键不存在则返回 end()。
  • count(key):返回键的出现次数(0 或 1,因键唯一),用于判断键是否存在。
// 1. 使用 find 查找
auto it = myMap.find(2);
if (it != myMap.end()) 
{
    cout << "找到键 2,值为:" << it->second << endl; // it->first 是键,it->second 是值
} 
else 
{
    cout << "未找到键 2" << endl;
}

// 2. 使用 count 判断存在性
if (myMap.count(3)) 
{
    cout << "键 3 存在" << endl;
} 
else 
{
    cout << "键 3 不存在" << endl;
}

3.3 删除键值对(erase)

  • 支持按键、迭代器或范围删除,返回删除的元素个数(按键删除时)。
// 1. 按键删除(返回删除的个数,0 或 1)
size_t deleted = myMap.erase(2); 
cout << "删除了 " << deleted << " 个元素" << endl;

// 2. 按迭代器删除(返回下一个迭代器)
auto it = myMap.find(3);
if (it != myMap.end()) 
{
    it = myMap.erase(it); // 删除后迭代器指向 next 元素
}

// 3. 范围删除(删除 [begin, end) 之间的元素)
myMap.erase(myMap.begin(), myMap.end()); // 清空 map(等价于 clear())

3.4 清空与大小(clear / size / empty)

  • clear():删除所有键值对,size() 变为 0。
  • size():返回当前键值对的数量。
  • empty():判断 map 是否为空(size() == 0 时返回 true)。
cout << "当前大小:" << myMap.size() << endl;

if (myMap.empty()) 
{
    cout << "map 为空" << endl;
} 
else 
{
    myMap.clear(); // 清空
    cout << "清空后大小:" << myMap.size() << endl;
}

3.5 遍历(迭代器 / 范围 for 循环)

  • 由于 std::map 有序,遍历结果按键升序排列。
// 1. 迭代器遍历
for (map<int, string>::iterator it = myMap.begin(); it != myMap.end(); ++it) 
{
    cout << it->first << ": " << it->second << endl;
}

// 2. 范围 for 循环(C++11 及以上)
for (const auto& pair : myMap) 
{ // pair 是 const pair<int, string>&
    cout << pair.first << ": " << pair.second << endl;
}
posted @ 2025-09-10 23:10  开心猪扒  阅读(87)  评论(0)    收藏  举报