假设我有以下代码:
std::vector< std::pair <int, char> > myVec;
or
std::list< std::pair <int, char> > myList;
/* then ***************/
std::list< std::pair <int, char> >::iterator listIt;
or
std::vector< std::pair <int, char> >::iterator vectorIt;
/* No difference between vector and list */
现在我需要搜索只是一个int
在他们的元素,所以:
vectorIt = std::find_if(myVec.begin(),myVect.end(),make_pair(.....));
^^^^^^^^^^^^^^^^^
我该怎么做?
写一元谓词,其采用std::pair
,并且如果返回true first
元素等于给定值。
例如:
struct CompareFirst
{
CompareFirst(int val) : val_(val) {}
bool operator()(const std::pair<int,char>& elem) const {
return val_ == elem.first;
}
private:
int val_;
};
然后
// find first element with first == 42
vectorIt = std::find_if(myVec.begin(),myVect.end(), CompareFirst(42));
它使用C ++ 11个lambda表达式,并给出一个value
,你想找到:
std::find_if(container.begin(), container.end(),
[&value](std::pair<int, char> const& elem) {
return elem.first == value;
});
其中container
是要么myVec
或myList
。
λ表达式[&value](...){...}
是一个临时表达式(的功能等同性很像可以传递“3 + 2”作为参数传递给一个int
参数,它会被转换为功能对象(很像一个在juanchopanza的答案)编译器,它从打字节省你和让你的代码本地化。
template <class T,class S> struct pair_equal_to : binary_function <T,pair<T,S>,bool> {
bool operator() (const T& y, const pair<T,S>& x) const
{
return x.first==y;
}
};
为了找到你应该使用下列所需的int值:
int find_me = 1;//chenge the value as you want
vector< pair <int, char> >::iterator it =
find_if(myVec.begin(),myVec.end(),bind1st(pair_equal_to<int,char>(),find_me));
例如 :
int main() {
vector< pair <int, char> > myVec;
pair<int,char> p1 = make_pair(1,'a');
pair<int,char> p2 = make_pair(2,'b');
pair<int,char> p3 = make_pair(1,'c');
myVec.push_back(p1);
myVec.push_back(p2);
myVec.push_back(p3);
vector< pair <int, char> >::iterator it = find_if(myVec.begin(),myVec.end(),bind1st(pair_equal_to<int,char>(),1));
if (it == myVec.end()) {
cout << "not found\n";
}
else {
cout<< "found - first instance is < " << it->first <<"," << it->second << " >";
}
return 0;
}