stl map 总结

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的函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值