C++程序员应了解的那些事(18)C++11 通过key访问map容器:下标访问、at()、find、lower_bound&upper_bound、equal_range

c++的map中通过key获取value的方法:
<1>最简单的是value  =map[key](下标访问)
1、在map中,下标访问由key查找value时,首先要判断map中是否包含key。
2、如果不检查,直接返回map[key],可能会出现意想不到的行为。如果map包含key,没有问题;如果map不包含key,使用下标有一个危险的副作用,会在map中插入一个key的元素,value取默认值,返回value也就是说,map[key]不可能返回null。
                             (☆下标访问的缺点:如果被访问元素不在map中,会插入此元素并初始化)
3、map提供了两种方式检查是否包含key,m.count(key),m.find(key)。
4、m.count(key):由于map不包含重复的key,因此m.count(key)取值为0,或者1,表示是否包含。
5、m.find(key):返回迭代器,判断是否存在。

<示例代码:存在key就使用,否则返回null>
//这里需要注意:前一种方法很直观,但是效率差很多。因为前面的方法,需要执行两次查找。因此,推荐使用后一种方法。
1 if(m.count(key)>0)
2 {
3     return m[key];
4 }
5 return null;

1 iter = m.find(key);
2 if(iter!=m.end())
3 {
4     return iter->second;
5 }
6 return null;

<2>C++ map访问方式简介:

(1)下标访问
map<int ,int> m;
m[1]=111;
m[2]=222;
m[3]=333;
cout<<m[4];
输出:
0
※可见下标访问输出了一个本来没有的m[4]。
(2)at(i)访问
map<int ,int> m;
m[1]=111;
m[2]=222;
m[3]=333;
cout<<m.at(4);
※此时会抛出一个异常表示没有找到key=4这个元素。所以这是一种相对安全的访问方式。
(3)find访问
multimap<int ,int> m;
m.insert({1,11});
m.insert({1,12});
m.insert({1,13});
m.insert({1,14});
m.insert({2,21});
m.insert({3,31});
auto Find=m.find(1);
auto Count=m.count(1);
while(Count)
{
    cout<<Find->second<<endl;
    Find++;
    Count--;
}
输出:
11
12
13
14

          示例代码可以输出所有key=1的元素,细心的同学已经注意到此时的容器已经变为了mapmulti并且元素的添加方式也已经改变了,multimap容器的元素添加方式不同于map,不能直接用m[key]=value的方式直接添加元素,必须用insert或者emplace!

(4)一种面向迭代器的解决方法lower_bound\upper_bound
multimap<int ,int> m;
m.insert({1,11});
m.insert({1,12});
m.insert({1,13});
m.insert({1,14});
m.insert({2,21});
m.insert({3,31});
for(auto lo=m.lower_bound(1),hi=m.upper_bound(2);lo!=hi;lo++) // map multimap 会根据key排序
{
    cout<<lo->second<<endl;
}
输出:
11
12
13
14
21
※此时不仅可以输出key为1的元素,也能输出key为2的元素。
(5)equal_range
multimap<int ,int> m;
m.insert({1,11});
m.insert({1,12});
m.insert({1,13});
m.insert({1,14});
m.insert({2,21});
m.insert({3,31});
for(auto pos=m.equal_range(1);pos.first!=pos.second;pos.first++)
{
    cout<<pos.first->second<<endl;
}
输出:
11
12
13
14
※equal_range会返回一个pair,first是一个迭代器,指向匹配的第一个元素,second指向后一个。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值