如何在c中过滤对象

新手上路,请多包涵

假设我有一堂课:

 class Cell {
  int ID;
  int valueX;
  int valueY;
};

在 main() 中,我声明了 Cells 向量:

 vector<Cell> myCells;

我的问题是编写一个函数,获取单元格向量、运算符(gt - 大于、le - 小于或等于等)、变量名称和整数,并返回符合要求的单元格向量?例如:

 vector<Cells> resultCells = filter(myCells, gt, valueX, 5)

是单元格的向量,其中每个单元格的 valueX 大于 5。

我的第一次尝试需要很多 ifs 和 switch,我确信这不是正确的解决方案。然后我向一个朋友要了一个小费,他告诉我诸如仿函数、lambdas、std::function、std::map、std::bind 之类的东西,这可以帮助我做到这一点,我已经读过它,但我我无法在实践中使用。

我在 Internet 上看到的示例之一就是 这个,但它不那么复杂且难以重用(对我而言)。

原文由 user6320378 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 378
2 个回答

把事情简单化:

 for (auto& c : myCells)
    if (c.valueX > 5)
        resultCells.push_back(c);


对于您的特定要求( “编写一个函数来获取单元格向量、运算符(gt - 大于、le - 小于或等于等)、变量名称和整数,并返回单元格向量” ),假设“get”表示“作为参数”:

 vector<Cell> filter(vector<Cell> const& cells,
                    function<bool(int,int)> const& op,
                    int Cell::* var,
                    int i) {
    vector<Cell> results;
    for (auto& c : cells)
        if (op(c.*var, i))
            results.push_back(c);
    return results;
}

用法:

 resultCells = filter(myCells, greater<int>(),  &Cell::valueX, 5);
resultCells = filter(myCells, less<int>(),     &Cell::valueY, 5);
resultCells = filter(myCells, equal_to<int>(), &Cell::ID,     5);

原文由 emlai 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用 std::copy_if 尝试这样的事情:

 std::vector<Cell> resultCells;
std::copy_if(myCells.begin(), myCells.end(),
             std::back_inserter(resultCells),
             [](const Cell& c) { return c.valueX > 5; });

原文由 Sander De Dycker 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题