web-dev-qa-db-ja.com

述語でstd :: findを使用する

述語と一緒に_std::find_関数を使用したい(正しい単語を使用しているかどうかわからない)。これがコードです

_#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class foo {
public:
  typedef pair< int, vector<int> > way;
  typedef pair< int, int > index;
  typedef pair< index, vector<way> > entry;
  vector< entry > table;

  void bar() 
  {
     vector<int> v1;
     v1.Push_back(1);
     v1.Push_back(2);

     way w = make_pair( 1, v1 );
     vector<way> v2;
     v2.Push_back(w);

     index id = make_pair( 10, 20 );
     entry en = make_pair( id, v2 );
     table.Push_back( en );
  }
  void insert()
  {
     index new_id = make_pair( 10, 20 );
     if ( find(table.begin(), table.end(), new_id) != table.end() ) {
        // index matched in the table
        // then I will Push back a new pair (way)
        // to the second part of the entry
     }
  }
};
int main()
{
  foo f;
  f.bar();
  f.insert();
  return 0; 
}
_

ご覧のとおり、find()は各エントリの最初の要素に基づいてtableを検索する必要があります。現在、_==_はpairを比較するためにオーバーロードされていないと言っています。

13
mahmood

あなたが欲しい std::find_if

...
if(find_if(table.begin(), table.end(), [&new_id](const entry &arg) { 
                                           return arg.first == new_id; }) != ...)

EDIT:C++ 11がない(したがってラムダがない)場合は、カスタム関数(関数または関数オブジェクト)を作成する必要がありますentry::firstと検索されたindexの比較を行うには:

struct index_equal : std::unary_function<entry,bool>
{
    index_equal(const index &idx) : idx_(idx) {}
    bool operator()(const entry &arg) const { return arg.first == idx_; }
    const index &idx_;
};

...
if(find_if(table.begin(), table.end(), index_equal(new_id)) != ...)

EDIT:indexintsのペアにすぎないため、constよりも値でキャプチャすることもできます。コードをより明確かつ簡潔に保つための参照ですが、実際には問題ではありません。

C++ 11では、 std::any_of

if (std::any_of(table.cbegin(), table.cend(),
                [&new_id](const entry &arg) { return arg.first == new_id; }))
4
Daniel Laügt