1. 程式人生 > >C++11對map容器的訪問:下標訪問、at()、find、lower_bound&upper_bound、equal_range

C++11對map容器的訪問:下標訪問、at()、find、lower_bound&upper_bound、equal_range

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指向後一個。