5

今、私はこのコードを持っています:

bool isAnyTrue() {
    for(std::list< boost::shared_ptr<Foo> >::iterator i = mylist.begin(); i != mylist.end(); ++i) {
        if( (*i)->isTrue() )
            return true;
    }

    return false;
}

私はここで Boost を使用しましたが、Python で書くような簡単な方法を思い出すことができませんでした。

def isAnyTrue():
    return any(o.isTrue() for o in mylist)

STL/Boost に多かれ少なかれこのように記述するための構造はありますか?

または、次の Python コードと同等のものかもしれません。

def isAnyTrue():
    return any(map(mylist, lambda o: o.isTrue()))

ほとんどの場合、Boost / STL に既存のany(および) 相当するものがまだあるかどうか疑問に思っています。allまたは、なぜないのですか (非常に便利なようで、Python で頻繁に使用するため)。

4

3 に答える 3

6

foreachC++ には (まだ)コンストラクトがありません。あなたはそれを自分で書かなければなりません/

とはいえ、std::find_ifここでアルゴリズムを使用できます。

bool isAnyTrue()
{
    return std::find_if(mylist.begin(), mylist.end(), std::mem_fun(&Foo::isTrue))
           != mylist.end();
}

また、おそらくstd::vectororstd::dequeではなくor を使用する必要がありますstd::list

編集: sthは、リストに実際のオブジェクトの代わりに含まれているため、実際にはコンパイルされないことを通知しましたshared_ptr...そのため、独自のファンクターを作成するか、ブーストに依存する必要があります:

//#include <boost/ptr_container/indirect_fun.hpp>

bool isAnyTrue()
{
    return std::find_if(mylist.begin(), mylist.end(), 
           boost::make_indirect_fun(std::mem_fun(&Foo::isTrue))) != mylist.end();
}

この 2 番目のソリューションはテストしていないことに注意してください。

于 2010-08-08T14:13:25.833 に答える
4

find_if の代わりに、カスタム any を使用します。find_if よりも読みやすさの点で気に入っていますが、それは好みの問題です。

template<class ForwardIterator, class Pred>
bool any(ForwardIterator begin, ForwardIterator end, Pred pred) {
  for( ; begin != end; ++begin)
    if(pred(*begin)) return true;

  return false;

  //or
  //return std::find_if(mylist.begin(), mylist.end(), std::mem_fun(&Foo::isTrue))
  //       != mylist.end();

}

bool isAnyTrue() {
  return any(mylist.begin(), mylist.end(), std::mem_fun(&Foo::isTrue));
}

編集:Billy ONealによるfind_ifを使用した代替any。

于 2010-08-08T14:16:45.873 に答える
4

新しい C++ 標準には std::any_of があります。

bool isAnyTrue()
{
    return std::any_of(mylist.begin(), mylist.end(), std::mem_fn(&Foo::isTrue)); // Note std::mem_fn and not std::mem_fun
}

VS2010 にはこれが実装されています。

于 2010-08-08T15:36:28.590 に答える