stl map 总结

来源:互联网 发布:产品介绍网站源码 编辑:程序博客网 时间:2024/04/30 07:46
 

map是c++的一个标准容器,它是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key.它使用红黑树实现,查询和插入时间效率都是log(n),元素是自动按key升序排序

 

1. map最基本的构造函数;

   map<string , int >mapstring;        map<int ,string >mapint;

  map<sring,char>mapstring;            map< char ,string>mapchar;

  map<char,int>mapchar;                 map<int ,char >mapint;

 

2. map添加数据;

 

改变map中的条目非常简单,因为map类已经对[]操作符进行了重载

enumMap[1] ="One";

enumMap[2] ="Two";

.....

这样非常直观,但存在一个性能的问题。插入2时,先在enumMap中查找主键为2的项,没发现,然后将一个新的对象插入enumMap,键是2,值是一个空字符串,插入完成后,将字符串赋为"Two";该方法会将每个值都赋为缺省值,然后再赋为显示的值,如果元素是类对象,则开销比较大。我们可以用以下方法来避免开销:

enumMap.insert(map<int,CString> :: value_type(2, "Two"))

 

3,map中元素的查找:

 

查找元素有两种方法:下标法和find方法

 

下标是最简单的查找方法:

string tmp =enumMap[2];

但是,只有当map中有这个键的实例时才对,否则会自动插入一个实例,值为初始化值

 

find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。       

   map<int ,string >::iterator l_it;

   l_it=maplive.find(112);

   if(l_it==maplive.end())

               cout<<"we do notfind 112"<<endl;

   else cout<<"wo find112"<<endl;

 

4,map中元素的删除:

  

for(ITERiter=mapTest.begin();iter!=mapTest.end();++iter)

{

cout<<iter->first<<":"<<iter->second<<endl;

mapTest.erase(iter);

}

这是一种错误的erase写法,会导致程序行为不可知.究其原因是map是关联容器,对于关联容器来说,如果某一个元素已经被删除,那么其对应的迭代器就失效了,不应该再被使用;否则会导致程序无定义的行为。

可以用以下方法解决这问题:

1.使用删除之前的迭代器定位下一个元素。STL建议的使用方式

for(ITERiter=mapTest.begin();iter!=mapTest.end();)

{

cout<<iter->first<<":"<<iter->second<<endl;

mapTest.erase(iter++);

}

2. erase()成员函数返回下一个元素的迭代器

for(ITERiter=mapTest.begin();iter!=mapTest.end();)

{

cout<<iter->first<<":"<<iter->second<<endl;

iter=mapTest.erase(iter);

}

 

5,map中 swap的用法:

 map中的swap不是一个容器中的元素交换,而是两个容器交换

 

6.map的sort问题:

  Map中的元素是自动按key升序排序,所以不能对map用sort函数:

 

7,   map的基本操作函数:

      C++ Maps是一种关联式容器,包含“关键字/值”对

      begin()         返回指向map头部的迭代器

      clear()        删除所有元素

      count()         返回指定元素出现的次数

      empty()         如果map为空则返回true

      end()           返回指向map末尾的迭代器

      equal_range()   返回特殊条目的迭代器对

      erase()         删除一个元素

      find()          查找一个元素

      get_allocator() 返回map的配置器

      insert()        插入元素

      key_comp()      返回比较元素key的函数

      lower_bound()   返回键值>=给定元素的第一个位置

      max_size()      返回可以容纳的最大元素个数

      rbegin()        返回一个指向map尾部的逆向迭代器

      rend()          返回一个指向map头部的逆向迭代器

      size()          返回map中元素的个数

      swap()           交换两个map

      upper_bound()    返回键值>给定元素的第一个位置

      value_comp()     返回比较元素value的函数

原创粉丝点击