我有一对带有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()答案 0 :(得分:2)
地图的类型为std::map<name, Person*>
,但remove
功能的参数为std::pair<std::string, Person*>
。除非name
是std::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
{
// ...
}
};
这是按值调用。