c++ - 如何在 for_each 中组合函数和谓词?

标签 c++ stl

如何使用 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算法不是我应该做的事情。

  1. 有没有办法只使用现有的 STL 关键字来生成这个?

    不想

     for_each( shapes.begin(), shapes.end(),
                       bind2nd( ptr_fun(display_shape_if_color_equals), 0 ) );
    

    因为,在更复杂的情况下,仿函数名称会误导仿函数的含义

  2. *有没有一种方法可以访问结构的成员(如 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/

相关文章:

C++ STL 算法,如 'comm' 实用程序

c++ - Visual Studio : What exactly are lib files (used for)?

c++ - mongodb - 将字段附加到 BSONObj

c++ - 如何确定一个类是否包含子类/类型?

c++ - ptrace PTRACE_ATTACH 失败 - 用户拥有的进程的 Linux 权限

C++ 复制构造函数和 STL 映射

c++ - 场景输出在第二次循环时给出错误答案

C++ - 将数据从 float vector 复制到 uint8 vector ?

c++ - 如何在 C++ 中有效地对四重结构进行排序?

c++ - 我应该为比较仿函数扩展 std::less 吗?