C++中对map容器的访问有好几种方式,最简单的就是直接通过下标访问,但是这种模式有一个缺点就是如果被访问元素不在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,关于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++)
    {
        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指向后一个。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐