C++ map是一种关联容器,它可以存储键值对的数据。map的特点是,它的键是唯一的,而且是按照一定的顺序排列的。map的底层实现是红黑树,所以它的插入、删除、查找等操作的时间复杂度都是O(logn)。
要使用map,首先需要包含头文件
#include <map>
#include <string>
#include <iostream>
using namespace std;
//声明一个map对象,键是string类型,值是int类型
map<string, int> m;
接下来,可以用以下几种方式向map中添加数据:
- 使用下标运算符[],如果键不存在,则会创建一个新的键值对,并将值初始化为默认值。如果键已经存在,则会覆盖原来的值。例如:
m["Alice"] = 100; //创建一个新的键值对,键为"Alice",值为100
m["Bob"] = 200; //创建一个新的键值对,键为"Bob",值为200
m["Alice"] = 300; //覆盖原来的值,将"Alice"对应的值改为300
- 使用insert()函数,它可以接受一个pair对象或一个迭代器范围作为参数。如果键不存在,则会插入一个新的键值对。如果键已经存在,则不会做任何改变。例如:
m.insert(pair<string, int>("Charlie", 400)); //插入一个新的键值对,键为"Charlie",值为400
m.insert(pair<string, int>("Alice", 500)); //不会改变任何东西,因为"Alice"已经存在
- 使用emplace()函数,它可以直接传递键和值作为参数,而不需要创建pair对象。它的效果和insert()函数相同。例如:
m.emplace("David", 600); //插入一个新的键值对,键为"David",值为600
m.emplace("Bob", 700); //不会改变任何东西,因为"Bob"已经存在
要从map中删除数据,可以用以下几种方式:
- 使用erase()函数,它可以接受一个键或一个迭代器或一个迭代器范围作为参数。它会删除指定的键值对,并返回被删除的元素个数或者下一个有效的迭代器。例如:
m.erase("Alice"); //删除"Alice"对应的键值对,并返回1
m.erase(m.begin()); //删除第一个键值对,并返回下一个有效的迭代器
m.erase(m.begin(), m.end()); //删除所有的键值对,并返回尾后迭代器
- 使用clear()函数,它会清空整个map,使其变成空容器。
要从map中查找数据,可以用以下几种方式:
- 使用find()函数,它可以接受一个键作为参数,并返回指向该键对应的元素的迭代器。如果没有找到该键,则返回尾后迭代器。例如:
auto it = m.find("Bob"); //查找"Bob"对应的元素,并返回指向它的迭代器
if (it != m.end()) {
cout << it->first << " " << it->second << endl; //输出"Bob 200"
} else {
cout << "Not found." << endl; //输出"Not found."
}
- 使用count()函数,它可以接受一个键作为参数,并返回该键在map中出现的次数。由于map中的键是唯一的,所以该函数只能返回0或1。例如:
int n = m.count("Charlie"); //查找"Charlie"在map中出现的次数,并返回它
if (n == 1) {
cout << "Found." << endl; //输出"Found."
} else {
cout << "Not found." << endl; //输出"Not found."
}
- 使用下标运算符[],如果键存在,则返回对应的值的引用。如果键不存在,则会创建一个新的键值对,并将值初始化为默认值,并返回该值的引用。例如:
int x = m["David"]; //查找"David"对应的值,并返回它,此时x为600
int y = m["Eve"]; //查找"Eve"对应的值,由于不存在,会创建一个新的键值对,键为"Eve",值为0,并返回该值的引用,此时y为0
要遍历map中的数据,可以用以下几种方式:
- 使用迭代器,可以用begin()和end()函数获取map的首尾迭代器,然后用++运算符逐个访问每个元素。每个元素是一个pair对象,可以用first和second成员访问键和值。例如:
for (auto it = m.begin(); it != m.end(); ++it) {
cout << it->first << " " << it->second << endl; //输出每个键值对
}
- 使用范围for循环,可以直接遍历map中的每个元素。每个元素是一个pair对象,可以用first和second成员访问键和值。例如:
for (auto p : m) {
cout << p.first << " " << p.second << endl; //输出每个键值对
}
- 使用for_each算法,可以传递一个函数或者一个lambda表达式作为参数,对map中的每个元素进行操作。每个元素是一个pair对象,可以用first和second成员访问键和值。例如:
#include <algorithm>
//定义一个函数,打印一个键值对
void print(pair<string, int> p) {
cout << p.first << " " << p.second << endl;
}
//使用for_each算法,传递print函数作为参数
for_each(m.begin(), m.end(), print);
//使用for_each算法,传递lambda表达式作为参数
for_each(m.begin(), m.end(), [](pair<string, int> p) {
cout << p.first << " " << p.second << endl;
});
以上就是C++ map的基本用法,希望对你有所帮助。
C++相关课程推荐 C++相关课程