C++ 查找_if和std::pair,但只查找一个元素

C++ 查找_if和std::pair,但只查找一个元素,c++,vector,lambda,iterator,std-pair,C++,Vector,Lambda,Iterator,Std Pair,假设我有以下代码: 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 &l

假设我有以下代码:

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 */

如何操作?

编写一个一元谓词,该谓词接受
std::pair
,如果
第一个
元素等于给定值,则返回true

例如:

struct CompareFirst
{
  CompareFirst(int val) : val_(val) {}
  bool operator()(const std::pair<int,char>& elem) const {
    return val_ == elem.first;
  }
  private:
    int val_;
};

这使用C++11 lambda表达式,并给定要查找的

std::find_if(container.begin(), container.end(), 
    [&value](std::pair<int, char> const& elem) {
    return elem.first == value;
});
std::find_if(container.begin(),container.end(),
[&value](标准::成对常量和元素){
返回elem.first==值;
});
其中,
container
myVec
myList

lambda表达式
[&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;
  }
};
布尔运算符()(常数T和y、常数对和x)常数 { 返回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 find_me=1;//根据需要设置值
向量::迭代器it=
查找if(myVec.begin(),myVec.end(),bind1st(pair_equal_to(),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;
    }
intmain(){
向量myVec;
配对p1=配对(1,'a');
配对p2=配对(2,'b');
配对p3=配对(1,'c');
myVec.推回(p1);
myVec.推回(p2);
myVec.推回(p3);
vector::迭代器it=find_if(myVec.begin(),myVec.end(),bind1st(pair_等于(),1));
if(it==myVec.end()){

你能用一个值或谓词搜索吗?另一个输入错误?
int
没有
第一个
@juanchopanza渴望在lambdas中拥有
auto
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;
    }