从地图容器中查找大于用户指定值的第一个值

时间:2011-09-07 14:25:49

标签: c++ map

我有一个地图容器。如何使用find_if返回大于用户指定搜索值的第一个值,如下所示:

std::map<string, int>::iterator it = find_if(Mymap.begin(), Mymap.end(), ......

非常感谢!

4 个答案:

答案 0 :(得分:4)

您确定要对通过容器的值大于您的条件的任何项目进行线性搜索吗?

最好还保留一个可以调用upper_bound的单独的排序值索引,以对数时间而不是元素数量为线性。或者替代地查看boost::multi_index

答案 1 :(得分:3)

使用lambda:

int n = MYVALUE;
auto it = std:: find_if(Mymap.begin(), Mymap.end(),
                        [n](const std::pair<std::string, int> & x) -> bool
                        { return x.second > n; }
                       );

(如果值是固定的,你可以将它直接放在lambda体内。对于C ++ 14及更高版本,lambda捕获可以是[n = MYVALUE],你不需要一个单独的外部变量{{1 }}。)

使用谓词:

n

答案 2 :(得分:2)

对于C ++ 03,您需要提供比较器对象,或者处理一些棘手的绑定:

typedef map<string, int>::value_type Value;

struct Comp
{
    Comp(int v) : m_v(v) { }

    bool operator()(const Value& v) const
    {
        return v.second > m_v;
    }

    int m_v;
};

void f()
{
    map<string, int> Mymap;
    map<string, int>::iterator it = find_if(Mymap.begin(), Mymap.end(), Comp(42));
}

答案 3 :(得分:0)

对于STL功能,您可能会发现B.Stroustrup这本书非常有用。 他提出了这个代码:

bool gt_42 (const pair <const string ,int>& r )
{
    return  r.second >42 ;
}
void f (map <string,int >& m )
{
    typedef map <string ,int >:: const_iterator MI ;
    MI i = find_if (m.begin (), m.end (), gt_42 );
    // ...
}

"The C++ Programming Language, Special Edition"

中的“标准库之旅”(可在.pdf文件中找到)