欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++中关于map的一些知识点

程序员文章站 2022-07-12 16:09:11
...

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 所示。

C++中关于map的一些知识点

通常遍历
    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;
	}

}
相关标签: 理解