▼《名企高频考点之-C++ STL map如何清空并打印节点》▼ ps:请在WiFi环境下打开,如果有钱任性请随意 map容器的数据为值对pair结构,不像简单的内置结构可以直接打印,从而导致很多人不知如何访问打印map的节点,在面试中,map删除节点会导致迭代器失效,这也是一个很高频的考点,所以本节针对清空和打印做一个简单讲解。


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中的数据打印和清空。希望能熟练应用,尤其是删除方法中迭代器失效问题是很多面试官会问到的。

randomaccessfile filechannel map 清空文件内容 map如何清空_迭代器


围绕map的其他主题咱们后面再详细介绍。 作者:鲍松山 审稿:王海斌 编辑:沈爽