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 是否通过 ref 或 value 传递每个 Person 对?值得用我自己的吗,这个比较干净。

除此之外,如果我想使用 boost::bind 或 std::bind (c++11) 而不是 bind1st,我该怎么做?这个函数是否应该像具有继承 std::unary_function 的 operator() 的结构?

4

2 回答 2

3

地图的类型是std::map<name, Person*>,但remove函数的参数是std::pair<std::string, Person*>name除非是 typedef for ,否则这将不起作用std::string

您的remove函数当前定义的方式,您将制作map's 的副本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, lambda 更好。

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
  {
    // ...
  }
};

这个函子是按引用调用的。然而:

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

这是按值调用的。

于 2013-07-09T20:32:09.303 回答