由于工作中经常用到map来进行数据保存和数据遍历,这里来总结一下,先看看C++ Primer这么描述的。map属于关联容器,定义了一个关联数组,类似vector,map是一个类模板。但是一个map要用两个类型来定义:关键字的类型和关键值的类型。在一个map中,一个给定关键字只能出现一次,每个关键字关联一个特定的值。解引用一个map迭代器会生成一个pair,它保存一个const关键字及其关联的值。话不多说,看代码,为了简洁,我省略了头文件。

1.map的遍历

 

int main()
{
      map<string,int> word={{"a",1},{"b",2}};
      map<string,int>::iterator IT;

      for(IT=word.begin();IT!=word.end();IT++)
      {
           cout<<IT->first<<','<<IT->second<<endl;
      }

      return 0;
}

打印:a,1

 

            b,2

2.map的插入操作(insert)。insert函数操作的返回值是一个pair,其first成员是一个迭代器,指向具有给定关键字的元素,second的成员是一个bool值

 

int main()
{
      map<string,int> word;
      pair<map<string,int>::iterator,bool> ret;//定义insert的返回值
      ret=word.insert(pair<string,int>("a",1));
      if(ret.second)
      {
            cout<<"yes"<<endl;
            cout<<ret.first->second<<endl;
      }

      return 0;
}

打印:yes

 

            1

3.map的删除操作(erase)

 

int main()
{
      map<string,int>word={{"a",1},{"b",2},{"c",3}};
      int num=word.erase("a")//利用关键字删除,返回删除元素的数量。鸡肋
      cout<<num<<endl;

      map<string,int>::iterator IT=word.begin();//注意这里IT重新赋值,因为前面删除过一个迭代器,指向不明确了
      map<string,int>::iterator IT1;

      IT1=word.erase(IT);//word.erase.(IT++)  这样。返回的迭代器仍指向下一个迭代器
      cout<<IT1->first<<','<<IT1->second<<endl;

      IT=word.begin();
      IT1=word.end();
      word.erase(IT,IT1);//根据范围迭代器进行删除,返回IT1

      return 0;
}

打印:1

 

            b,2

IT++是自加操作,将IT指向下一个地址并且返回IT原来的副本。参数的处理优先于函数的调用。不信看

 

void func(map<string,int>::iterator it)
{
       cout<<it->first<<','<<it->second<<endl;
}

int main()
{
      map<string,int>word={{"a",1},{"b",2}};
      map<string,int>::iterator IT=word.begin();
      func(IT++);
      cout<<IT->first<<','<<IT->second<<endl;

      return 0;
}

打印:a,1

 

            b,2

 

4.map中元素的查找(find),返回一个迭代器,指向第一个关键字为key的元素,没找到则返回map的尾部迭代器

 

int main()
{
      map<string,int>word={{"a",1}};
      map<string,int>::iterator IT;

      IT=word.find("a");
      cout<<IT->first<<','<<IT->second<<endl;
 
      return 0;
}

打印:a,1

 

 map还有clear(),count(),empty(),size(),swap()等函数

平常学习中,map中对应的关键值只存放一个元素。实际工作中需要存放多个元素,此时关键值变为结构体了。

struct Node
{
      int data;
      int data1;
};

int main()
{
      map<int,Node> Map;//struct标识不需要写进去
      Map.insert(pair<int,Node>(1,{2,3}));
      map<int,Node>::iterator it=Map.begin();
      cout<<it->second.data<<','<<it->second.data1<<endl;

      return 0;
}

打印:2,3