std :: for_each是按值传递还是按引用传递?

时间:2013-07-09 20:25:54

标签: c++ pass-by-reference pass-by-value stdmap

我有一对带有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,我该怎么做?该函数应该像struct一样具有继承std :: unary_function?

的operator()

2 个答案:

答案 0 :(得分:2)

地图的类型为std::map<name, Person*>,但remove功能的参数为std::pair<std::string, Person*>。除非namestd::string的typedef,否则此操作无效。

当前定义了remove功能的方式,您将复制map的{​​{1}}。将函数签名更改为:

value_type

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

std::bind1st

但是如果你可以使用C ++ 11的功能,就不需要std::for_each( people.begin(), people.end(), std::bind( &MyMap::remove, this, std::placeholders::_1 ) ); ,lambda会更好。

std::bind

或使用基于循环的范围

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

答案 1 :(得分:1)

for_each将按值或按引用调用仿函数,具体取决于您如何定义仿函数。

例如:

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

这个仿函数是ref-by-ref。但是:

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

这是按值调用。