我有一個地圖容器。如何使用find_if返回大於用戶指定的搜索值的第一個值,如下所示:從地圖容器中查找大於用戶指定值的第一個值
std::map<string, int>::iterator it = find_if(Mymap.begin(), Mymap.end(), ......
非常感謝!
我有一個地圖容器。如何使用find_if返回大於用戶指定的搜索值的第一個值,如下所示:從地圖容器中查找大於用戶指定值的第一個值
std::map<string, int>::iterator it = find_if(Mymap.begin(), Mymap.end(), ......
非常感謝!
隨着拉姆達:
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; }
);
(如果該值是固定的也可以把它直接拉姆達體內。)
隨着謂詞:
struct Finder
{
Finder(int n_) : n(n_) { }
int n;
bool operator()(const std::pair<std::string, int> & x) const
{
return x.second > n;
}
};
std::find_if(Mymap.begin(), Mymap.end(), Finder(MYVALUE));
對於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));
}
親愛的Alexander Poluektov 非常感謝!它現在有效。 – GoldenLee
您確定要通過容器對任何值大於標準的項目進行線性搜索嗎?
也許會更好地保持排序值的單獨索引,您可以調用upper_bound
,以對數時間執行,而不是元素數量的線性。替代地查看boost::multi_index
。
當涉及到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);
// ...
}
(以.pdf文件可用)「標準庫的遊」的std :: find_if絕對需要?如果不是的話,Mark B的答案會更快。 –