std::find_ifでstd::pairの要素を検索する(C++03)

少し詰まったのでメモ。

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;
}

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

Shoichiro Masuoka

CNS, the Univ. of Tokyo. Dcotoral student

関連項目