1

std::string と Person ポインターのペアを持つテストマップがあります

class MyMap {
public:
    void clear() {
       std::for_each(people.begin(), people.end(),std::bind1st(std::mem_fun(&MyMap::remove), this));
    }
    void remove(std::pair<std::string, Person*> p) { delete p.second; }
private:
    std::map<name, Person*> people;
};

私の質問は、 for_each が各 Person ペアを参照または値で渡すことですか? 私自身のものを使う価値はありますか、これは少しきれいです。

それに加えて、bind1st の代わりに boost::bind または std::bind (c++11) を使用したい場合、どうすればよいですか? この関数は、std::unary_function を継承する operator() を持つ構造体のようにする必要がありますか?

4

2 に答える 2

3

マップのタイプは ですが、関数std::map<name, Person*>のパラメーターは です。typedef for でない限り、これは機能しません。removestd::pair<std::string, Person*>namestd::string

remove関数が現在定義されている方法では、mapのコピーを作成しますvalue_type。関数のシグネチャを次のように変更します。

void remove(std::pair<const std::string, Person *>& p)
//                    ^^^^^                       ^
//                    key must be const           take a reference

std::bind代わりに使用するにはstd::bind1st

std::for_each( people.begin(), 
               people.end(), 
               std::bind( &MyMap::remove, this, std::placeholders::_1 ) );

しかし、C++11 の機能を使用できる場合は、必要はありませんstd::bind。ラムダの方がはるかに優れています。

std::for_each( people.begin(), 
               people.end(), 
               []( decltype(*people.begin())& p ) { delete p.second; } );

または for ループに基づく範囲を使用します

for( auto&& p : people ) {
    delete p.second;
}
于 2013-07-09T20:49:49.993 に答える
1

for_eachファンクターをどのように定義したかに応じて、値渡しまたは参照渡しのいずれかでファンクターを呼び出します。

例えば:

struct Gizmo
{
  bool operator() (const Zippy& rhs) const
  {
    // ...
  }
};

このファンクターは call-by-ref です。でも:

struct Gizmo
{
  bool operator() (Zippy rhs) const
  {
    // ...
  }
};

これは値渡しです。

于 2013-07-09T20:32:09.303 に答える