【问题标题】:C++ how to select multiple objects using lambda find_ifC ++如何使用lambda find_if选择多个对象
【发布时间】:2017-11-08 10:22:03
【问题描述】:

我正在尝试遍历对象向量,然后选择一个匹配的特定 ID。下面的示例将打印与 ID 匹配的第一个对象,但如何打印或选择少数匹配相同 ID 的对象?我尝试使用 while 循环,但它会起作用,因为我每次都必须增加迭代器,我总是会得到“分段错误”。

it = find_if(database.begin(), database.end(), [&id](cd &c) {
    return c.getId() == id;
});

int index = std::distance(database.begin(), it); //finding index of the object
database[index].print(); //prints everything from the object

【问题讨论】:

  • 使用for 循环。
  • @Ron 我试过但是内联函数在 for 循环中不起作用
  • 请显示不起作用的代码。 Afaik 没有算法可以完全满足您的需求。你可以使用for_each,但这也只是一个变相的for循环
  • @Ron 你回答了我的问题,非常感谢。

标签: c++ object vector lambda iterator


【解决方案1】:

有几种选择,包括:

for (auto& c: database) {
    if (c.getId() == id) {
        c.print();
    }
}

  auto next_it = [&](auto beg) {
      return std::find_if(beg, database.end(),
          [&id](cd &c) {
              return c.getId() == id;
          });
  };

  for (auto it = next_it(database.begin()); it != database.end(); it = next_it(it + 1)) {
      it->print();
  }

或(与range-v3

for (auto& c: database | ranges::filter([&](const auto& c){ return c.getId() == id; })) {
    c.print();
}

【讨论】:

    【解决方案2】:

    按原样需要某种循环。对于您想做的事情,没有单一的路线。我想你想改用std::copy_if 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-13
      • 2017-08-13
      • 2011-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多