如何在STL映射(集)中查找范围内的所有元素

时间:2015-05-13 08:10:37

标签: c++ dictionary stl

我在stl和范围[lo,hi]中有一张地图。

找到适合此范围的地图中所有元素的最佳方法是什么?

UDT:

关于upper_bound和low_bound的问题是:

例如,我有{1,2,7,8}的集合或地图,我的范围是[3,6]。 lower_bound将指向7,upper_bound将指向2.假设我不想删除史密斯,但只写出范围内的所有元素。我该怎么做?在这种情况下擦除会有多大的复杂性?

2 个答案:

答案 0 :(得分:7)

如果您正在使用std :: map,它已经排序,您可以使用lower_bound / upper_bound来自cplusplus.com的示例:

static

答案 1 :(得分:2)

这是一个示范程序

#include <iostream>
#include <map>
#include <utility>

int main()
{
    const size_t N = 10;
    std::map<int, char> m;

    for ( size_t i = 0; i < N; i++ ) m.insert( { i, char( 'A' + i ) } );

    std::pair<int, int> range( 3, 7 );

    auto low = m.lower_bound( range.first );
    auto upper = m.upper_bound( range.second );

    if ( low != upper )
    {
        for ( auto it = low; it != upper; ++it )
        {
            std::cout << it->first << ' ' << it->second << std::endl;
        }
    }
}

程序输出

3 D
4 E
5 F
6 G
7 H

这是专门为您的例子编写的程序

#include <iostream>
#include <map>
#include <utility>

int main()
{
    std::map<int, char> m = { { 1, 'B' }, { 2, 'C' },  { 7, 'H' }, { 8, 'I' } };

    std::pair<int, int> range( 3, 6 );

    auto low = m.lower_bound( range.first );
    auto upper = m.upper_bound( range.second );

    if ( low != upper )
    {
        for ( auto it = low; it != upper; ++it )
        {
            std::cout << it->first << ' ' << it->second << std::endl;
        }
    }
    else
    {
        std::cout << "The range is empty" << std::endl;
    }
}

程序输出

The range is empty