find_if和std :: pair,但只是一个元素

Per*_*ulf 6 c++ lambda iterator vector 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 <int, char> >::iterator vectorIt;

/* No difference between vector and list */
Run Code Online (Sandbox Code Playgroud)

现在我需要搜索其中的一个int元素,所以:

vectorIt = std::find_if(myVec.begin(),myVect.end(),make_pair(.....));
                                                   ^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

jua*_*nza 14

写一个带有a的一元谓词,std::pair如果该first元素等于给定值,则返回true .

例如:

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

然后

// find first element with first == 42
vectorIt = std::find_if(myVec.begin(),myVect.end(), CompareFirst(42));
Run Code Online (Sandbox Code Playgroud)


Tem*_*Rex 13

这使用C++ 11 lambda表达式,并给出value你想要找到的:

std::find_if(container.begin(), container.end(), 
    [&value](std::pair<int, char> const& elem) {
    return elem.first == value;
});
Run Code Online (Sandbox Code Playgroud)

其中container或者是myVecmyList.

lambda表达式[&value](...){...}是临时表达式的功能等价(很像你可以将"3 + 2"作为参数传递给int 参数.它将被编译器转换为函数对象(很像juanchopanza的答案).它可以帮助您避免键入并保持代码本地化.