1.map的值类型pair
template<class _Ty1, class _Ty2>struct pair{ // store a pair of values typedef pair<_ty1 _ty2> _Myt; typedef _Ty1 first_type; typedef _Ty2 second_type; // default construct pair() : first(), second() {} // construct from specified values pair(const _Ty1& _Val1, const _Ty2& _Val2) : first(_Val1), second(_Val2) {} _Ty1 first; // the first stored value _Ty2 second; // the second stored value};
pair是一个结构体,其成员属性默认为共有的,所以可以对其成员first和second直接进行访问。
2. map打印节点
2.1 C++11 for循环、迭代器 方式
#include#include#includeint main(){ std::map<int, std::string> ismap; std::pair<int, std::string> v1 = {1, "Student"}; std::pair<int, std::string> v2 = {2, "Teacher"}; std::pair<int, std::string> v3 = {3, "Friend"}; std::pair<int, std::string> v4 = {4, "Bit"}; ismap.insert(v1); ismap.insert(v2); ismap.insert(v3); ismap.insert(v4); //利用C++11 的for循环方式访问,在输出成员信息时,直接访问first和second for(auto const &e : ismap) std::cout<" : "< //利用C++11的auto自动推导迭代器it类型, //由于迭代器是指向pair值,所以通过指向符->进行访问first和second成员 auto it = ismap.begin(); while(it != ismap.end()) { std::cout<first<<" : "<second<<std::endl; ++it; } //手动定义迭代器类型方式访问pair的first成员和second成员 std::map<int, std::string>::iterator it = ismap.begin(); while(it != ismap.end()) { std::cout<first<<" : "<second<<std::endl; ++it; } return 0;}
不管使用什么方式,万变不离其中,都是拿到值对结构的信息,然后对first和second成员进行访问。
2.2 如果知道关键值,可以利用[]进行打印节点
#include#include#includeint main(){ std::map<int, std::string> ismap; std::pair<int, std::string> v1 = {1, "Student"}; std::pair<int, std::string> v2 = {2, "Teacher"}; std::pair<int, std::string> v3 = {3, "Friend"}; std::pair<int, std::string> v4 = {4, "Bit"}; ismap.insert(v1); ismap.insert(v2); ismap.insert(v3); ismap.insert(v4); //如果知道关键值,可以利用[]方式打印节点 std::cout<1]<< std::cout<2]<< std::cout<3]<< std::cout<4]<< return 0;}//输出结果StudentTeacherFriendBit
2.3 反向打印
#include#include#includeint main(){ std::map<int, std::string> ismap; std::pair<int, std::string> v1 = {1, "Student"}; std::pair<int, std::string> v2 = {2, "Teacher"}; std::pair<int, std::string> v3 = {3, "Friend"}; std::pair<int, std::string> v4 = {4, "Bit"}; ismap.insert(v1); ismap.insert(v2); ismap.insert(v3); ismap.insert(v4); //手动反向迭代器类型方式反向输出pair的first成员和second成员 std::map<int, std::string>::reverse_iterator rit = ismap.rbegin(); while(rit != ismap.rend()) { std::cout<first<<" : "<second<<std::endl; ++rit; } return 0;}//输出结果4 : Bit3 : Friend2 : Teacher1 : Student
3.清空数据
3.1 使用clear方法清空数据
#include#include#includeint main(){ std::map<int, std::string> ismap; std::pair<int, std::string> v1 = {1, "Student"}; std::pair<int, std::string> v2 = {2, "Teacher"}; std::pair<int, std::string> v3 = {3, "Friend"}; std::pair<int, std::string> v4 = {4, "Bit"}; ismap.insert(v1); ismap.insert(v2); ismap.insert(v3); ismap.insert(v4); //利用clear函数清空数据 ismap.clear(); return 0;}//输出结果数据已被清空.
3.2 使用erase方法清空数据
#include#include#includeint main(){ std::map<int, std::string> ismap; std::pair<int, std::string> v1 = {1, "Student"}; std::pair<int, std::string> v2 = {2, "Teacher"}; std::pair<int, std::string> v3 = {3, "Friend"}; std::pair<int, std::string> v4 = {4, "Bit"}; ismap.insert(v1); ismap.insert(v2); ismap.insert(v3); ismap.insert(v4); //利用删除函数erase函数清空数据 ismap.erase(ismap.begin(), ismap.end()); auto it = ismap.begin(); if(it == ismap.end()) std::cout<<"数据已被清空."<<std::endl; return 0;}//输出结果数据已被清空.
3.3 使用erase方法删除数据,迭代器失效
#include#include#includeint main(){ std::map<int, std::string> ismap; std::pair<int, std::string> v1 = {1, "Student"}; std::pair<int, std::string> v2 = {2, "Teacher"}; std::pair<int, std::string> v3 = {3, "Friend"}; std::pair<int, std::string> v4 = {4, "Bit"}; ismap.insert(v1); ismap.insert(v2); ismap.insert(v3); ismap.insert(v4); //让迭代器it指向第一个值并打印 auto it = ismap.begin(); std::cout<first<<" : "<second<<std::endl; //删除it所指的值 ismap.erase(it); //此时迭代器失效,继续访问程序将崩溃 std::cout<first<<" : "<second<<std::endl; return 0;}
3.4 预防迭代器失效
将上述删除代码修改为:it = ismap.erase(it)
#include#include#includeint main(){ std::map<int, std::string> ismap; std::pair<int, std::string> v1 = {1, "Student"}; std::pair<int, std::string> v2 = {2, "Teacher"}; std::pair<int, std::string> v3 = {3, "Friend"}; std::pair<int, std::string> v4 = {4, "Bit"}; ismap.insert(v1); ismap.insert(v2); ismap.insert(v3); ismap.insert(v4); //让迭代器it指向第一个值并打印 auto it = ismap.begin(); std::cout<first<<" : "<second<<std::endl; //删除it所指的值,并重新更新it的指向,否则原来迭代器将会失效 it = ismap.erase(it); //更新迭代器后,it指向删除数据的下一个数据 std::cout<first<<" : "<second<<std::endl; return 0;}//输出结果1 : Student2 : Teacher
小结
以上介绍了map中的数据打印和清空。希望能熟练应用,尤其是删除方法中迭代器失效问题是很多面试官会问到的。
围绕map的其他主题咱们后面再详细介绍。 作者:鲍松山 审稿:王海斌 编辑:沈爽