相关文章推荐
逼格高的麻辣香锅  ·  aliyun_push ...·  1 年前    · 
儒雅的皮带  ·  Microsoft Visual ...·  2 年前    · 

std::find_if を使って std::pair の要素を検索する方法です。

今回やりたかったことは、vector配列に詰められたpairの1番目の要素に対して、任意の数が含まれているのかの検索をかけることです。具体的に

 std::vector<std::pair<int, int> > p;
 p.push_back(std::make_pair(1,2));
 p.push_back(std::make_pair(11,12));
 p.push_back(std::make_pair(101,102));

のようにpairをvectorに詰めて、その中でpairの1番目(もしくは2番目)の値が動的に指定した値になっているかを判別したい。

ここで、動的ではなく静的な数字を指定するのであれば、以下のような関数を用意してやれば実装可能です。

#include <iostream>
#include <vector>
#include <algorithm>
bool SearchFirstIsOne(const std::pair<int, int>& pair)
  return pair.first == 1;
int main(void)
  std::vector<std::pair<int, int> > p;
  p.push_back(std::make_pair(1,2));
  p.push_back(std::make_pair(11,12));
  p.push_back(std::make_pair(101,102));
  if (std::find_if(p.begin(), p.end(), SearchFirstIsOne) == p.end()) {
    std::cout << "not found" << std::endl;
  } else {
    std::cout << "found" << std::endl;
  return 0;

ただし、今回はこれを動的にしたいため、工夫が必要です。

こちらのサイトを参考にさせてもらい、構造体(もしくはクラス)を作成し、その構造体で演算子()をオーバーライドしてあげれば実装できるようです。

#include <iostream>
#include <vector>
#include <algorithm>
class SearchFirst
  int Num;
public:
  SearchFirst(int num) : Num(num) {}
  bool operator()(const std::pair<int, int> pair) const {
    return Num == pair.first;
int main(void)
  std::vector<std::pair<int, int> > p;
  p.push_back(std::make_pair(1,2));
  p.push_back(std::make_pair(11,12));
  p.push_back(std::make_pair(101,102));
  const int request = 1;
  if (std::find_if(p.begin(), p.end(), SearchFirst(request) == p.end())) {
    std::cout << "num " << request << ": not found" << std::endl;
  } else {
    std::cout << "num " << request << ": found" << std::endl;
  return 0;

このような感じで実装出来ました。