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;
}
このような感じで実装出来ました。