C++编程中,map是一个容器类模板,用于存储键值对(key-value)形式的数据。其本质是一种关联式容器(associative container),通过键(key)来进行查找和访问值(value)。
map中的键值对是按照键进行自动排序的,可以根据键名查找值,并且支持遍历所有的键值对。在查找元素时,map使用红黑树(RB tree)数据结构来实现,因此查找效率相当高。
在C++中使用map时,需要引入头文件<map>,其中键和值的类型可以任意指定。常见的键值对类型有string-int、int-double等。
以下是使用map来存储字符串和整数的示例:
#include <iostream>
#include <map>
using namespace std;
int main() {
map<string, int> m;
m["apple"] = 1;
m["orange"] = 2;
m["banana"] = 3;
cout << "m contains:" << endl;
for (auto it = m.begin(); it != m.end(); it++) {
cout << it->first << ": " << it->second << endl;
}
return 0;
}
这段程序中,我们定义了一个map类型的对象m,并将三个键值对分别插入到这个map中。然后我们遍历这个map,并输出其中的键值对。输出结果为:
```
m contains:
apple: 1
banana: 3
orange: 2
```
可以看到,输出结果中键是按照字母顺序进行排序的,而值则与键名一一对应。这是map容器的特性之一。
那么map具体怎么使用呢
使用map时,需要注意以下几点:
1. map中的键值对是按照键进行自动排序的,所以键类型必须支持小于比较运算符,或者用户需要提供键类型的比较函数(或仿函数)来进行排序。
2. map中的键必须是唯一的,如果要存储重复键,则需要使用multimap容器。
3. map的迭代器是一种双向迭代器,支持前后移动,但不支持随机访问。
4. 使用下标操作符[]可以方便地插入、访问和修改元素,如果元素不存在,则会自动插入一个键为该下标的新元素,同时值被初始化为元素类型的默认值。
#include <iostream>
#include <map>
using namespace std;
int main() {
map<string, int> m;
// 插入元素
m.insert(make_pair("apple", 10));
m.insert(make_pair("orange", 20));
m["banana"] = 30;
// 查找元素
if (m.find("apple") != m.end()) {
cout << "apple: " << m["apple"] << endl;
} else {
cout << "apple not found" << endl;
}
// 遍历元素
cout << "m contains:" << endl;
for (auto it = m.begin(); it != m.end(); it++) {
cout << it->first << ": " << it->second << endl;
}
// 修改元素
m["apple"] = 50;
// 删除元素
m.erase("orange");
return 0;
}
这段程序中,我们定义了一个map类型的对象m,并在其中插入三个键值对。然后我们可以通过find函数来查找某个键是否存在,或使用下标操作符[]来访问某个值。接着我们遍历这个map,并输出其中的键值对。然后我们可以通过下标操作符[]来修改某个键对应的值。最后我们使用erase函数删除指定的键值对。
输出结果为:
```
apple: 10
m contains:
apple: 10
banana: 30
orange: 20
```