std :: listのfind_ifで構造体内のintを検索します

c++ list stl
std :: listのfind_ifで構造体内のintを検索します
リストに構造体が含まれている場合、std

listでfind_ifを使用するにはどうすればよいですか? これに対する私の最初の擬似コードの試みは次のようになります。

typename std::list::iterator found =
    find_if(cal.begin(), cal.last(), predicate);

ここでの問題は、述語がリストに直接表示されるのではなく、 `event.object.return_number()`内に表示されることです。 構造体内にネストされ、アクセスするためにgetメソッドを必要とするintをどのように参照すると思いますか。

  1  0


ベストアンサー

コンパイラーがおそらくすでに部分的に実装しているC ++ 0xでは、次のことができます。

find_if(cal.begin(), cal.last(), [&](const Event& e)
        {
            return e.object.return_number() == value_to_find;
        });

2


ファンクタクラスを使用できます(関数に似ていますが、設定などの状態を持つことができます)。

class Predicate
{
public:
    Predicate(int x) : x(x) {}
    bool operator() (const Cal &cal) const { return cal.getter() == x; }
private:
    const int x;
};

std::find_if(cal.begin(), cal.end(), Predicate(x));

2


次のような述語を設定します。

struct IsEventObjectReturnNumber
{
   int num;
   explicit IsEventObjectReturnNumber( int n ) : num( n ) {}

   bool operator()(const Event & event ) const
   {
      return event.object.return_number() == num;
   }
};

std::list::iterator = std::find_if(cal.begin(), cal.end(), IsEventObjectReturnNumber(x));

1


(それほど単純ではありませんが)最も単純な方法(C ++ 11がない場合)は、カスタムコンパレータです。

struct CompareMyStruct {
    int n_;
    CompareMyStruct(int n) : n_(n) { }
    bool operator()(const Event& a) const {
        return a.object.return_number() == n_;
    }
};

typename std::list::iterator found =
    find_if(cal.begin(), cal.last(), CompareMyStruct(123));

0


タイトルとURLをコピーしました