如何使用 for_each()
在容器的 some 部分调用 Function
?
我创建了一个 for_each_if()
来做一个
for( i in shapes )
if( i.color == 1 )
displayShape(i);
通话看起来像
for_each_if( shapes.begin(), shapes.end(),
bind2nd( ptr_fun(colorEquals), 0 ),
ptr_fun( displayShape ) );
bool colorEquals( Shape& s, int color ) {
return s.color == color;
}
但是,我觉得模仿类STL算法不是我应该做的事情。
有没有办法只使用现有的 STL 关键字来生成这个?
我不想做
for_each( shapes.begin(), shapes.end(), bind2nd( ptr_fun(display_shape_if_color_equals), 0 ) );
因为,在更复杂的情况下,仿函数名称会误导仿函数的含义
*有没有一种方法可以访问结构的成员(如
colorEquals
)以获取类似for_each
的函数,而无需创建函数? *
最佳答案
模仿类似STL 的算法正是您应该做的。这就是它们在 STL 中的原因。
具体来说,您可以使用仿函数而不是创建实际函数并绑定(bind)它。这真的很整洁。
template<typename Iterator, typename Pred, typename Operation> void
for_each_if(Iterator begin, Iterator end, Pred p, Operation op) {
for(; begin != end; begin++) {
if (p(*begin)) {
op(*begin);
}
}
}
struct colorequals {
colorequals(int newcol) : color(newcol) {}
int color;
bool operator()(Shape& s) { return s.color == color; }
};
struct displayshape {
void operator()(Shape& s) { // display the shape }
};
for_each_if(shapes.begin(), shapes.end(), colorequals(0), displayshape());
这通常被认为是惯用的方式。
关于c++ - 如何在 for_each 中组合函数和谓词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3185132/