C++中关于map的一些知识点
标准库为 map 容器配备的是双向迭代器(bidirectional iterator)。这意味着,map 容器迭代器只能进行 ++p、p++、–p、p–、*p 操作,并且迭代器之间只能使用 == 或者 != 运算符进行比较。
值得一提的是,相比序列式容器,map 容器提供了更多的成员方法(如表 1 所示),通过调用它们,我们可以轻松获取具有指定含义的迭代器。
成员方法 | 功能 |
begin() | 返回指向容器中第一个(注意,是已排好序的第一个)键值对的双向迭代器。如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。 |
end() | 返回指向容器最后一个元素(注意,是已排好序的最后一个)所在位置后一个位置的双向迭代器,通常和 begin() 结合使用。如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。 |
rbegin() | 返回指向最后一个(注意,是已排好序的最后一个)元素的反向双向迭代器。如果 map 容器用 const 限定,则该方法返回的是 const 类型的反向双向迭代器。 |
rend() | 返回指向第一个(注意,是已排好序的第一个)元素所在位置前一个位置的反向双向迭代器。如果 map 容器用 const 限定,则该方法返回的是 const 类型的反向双向迭代器。 |
cbegin() | 和 begin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的键值对。 |
cend() | 和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的键值对。 |
crbegin() | 和 rbegin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的键值对。 |
crend() | 和 rend() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的键值对。 |
find(key) | 在 map 容器中查找键为 key 的键值对,如果成功找到,则返回指向该键值对的双向迭代器;反之,则返回和 end() 方法一样的迭代器。另外,如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。 |
lower_bound(key) | 返回一个指向当前 map 容器中第一个大于或等于 key 的键值对的双向迭代器。如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。 |
upper_bound(key) | 返回一个指向当前 map 容器中第一个大于 key 的键值对的迭代器。如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。 |
equal_range(key) | 该方法返回一个 pair 对象(包含 2 个双向迭代器),其中 pair.first 和 lower_bound() 方法的返回值等价,pair.second 和 upper_bound() 方法的返回值等价。也就是说,该方法将返回一个范围,该范围中包含的键为 key 的键值对(map 容器键值对唯一,因此该范围最多包含一个键值对)。 |
表 1 中多数的成员方法,诸如 begin()、end() 等,在学习序列式容器时已经多次使用过,它们的功能如图 2 所示。
通常遍历
std::map<std::string, std::string>myMap;
//调用 begin()/end() 组合,遍历 map 容器
for (auto iter = myMap.begin(); iter != myMap.end(); ++iter) {
cout << iter->first << " " << iter->second << endl;//此处用的是迭代器来查找的key和value;
}
此处用的是迭代器来查找的key和value;
}
反向遍历:
此处比较陌生,但容易碰到,(rbegin(),rend())
for (auto iter = myMap.rbegin(); iter != myMap.rend(); --iter) {
cout << iter->first << " " << iter->second << endl;//此处用的是迭代器来查找的key和value;
}
注意事项
对于map的插入不是这样的:
a.insert(" 2", 3); a.insert("1", 4); a.insert("3", 6); a.insert("5", 8);
而以下是正确的的:
//插入 map<int, int> m; //第一种插入方式 m.insert(pair<int, int>(1, 10)); //第二种插入方式 m.insert(make_pair(2, 20)); //第三种插入方式 m.insert(map<int, int>::value_type(3, 30)); //第四种插入方式 m[4] = 40; //这一个是最简单的,;
遍历(全部)
对于键值对单独的遍历:
增强for循环(foreach)
for (auto i : a)
{
cout << i.first << i.second<<endl;
map容器的排序
map容器默认排序规则为:按照key值进行从小到大的排序
- 可以利用仿函数,改变排序规则;
#include"head.h"
//struct cmp//struct也可以用来排序;
//{
// bool operator()(int a, int b)const
// {
// return a < b;
// }
//};
class cmp {//struct同样可以
public :
bool operator()(int a, int b)const
//此处一定要加上const,否则报错.如果不加,报错
//C++在函数声明的时候,后面的const是限定函数类型为常成员函数,常成员函数是不能够改变成员变量值的函数;
{
return a < b;
}
};
int main()
{
map<int , int,cmp>a;//在此处添加排序的cmp;
a[3] = 5;
a[5] = 3;
a[6] = 2;
a[0] = 43;
for (auto i : a)
{
cout << i.first << " " << i.second << endl;
}
}