从地图容器中查找大于用户指定值的第一个值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从地图容器中查找大于用户指定值的第一个值相关的知识,希望对你有一定的参考价值。
我有一个地图容器。如何使用find_if返回大于用户指定搜索值的第一个值,如下所示:
std::map<string, int>::iterator it = find_if(Mymap.begin(), Mymap.end(), ......
非常感谢你!
答案
用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]
,你不需要一个单独的外部变量n
。)
带谓词:
struct Finder
{
Finder(int n_) : n(n_) { }
int n;
bool operator()(const std::pair<std::string, int> & x) const
{
return x.second > n;
}
};
auto it = std::find_if(Mymap.begin(), Mymap.end(), Finder(MYVALUE));
另一答案
您确定要对通过容器的值大于您的条件的任何项目进行线性搜索吗?
最好还保留一个单独的排序值索引,您可以将其命名为upper_bound
,以对数时间而不是元素数量为线性。交替地看看boost::multi_index
。
另一答案
对于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));
}
另一答案
在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文件中找到)
以上是关于从地图容器中查找大于用户指定值的第一个值的主要内容,如果未能解决你的问题,请参考以下文章