【问题标题】:Impose a condition on std::max_element对 std::max_element 施加条件
【发布时间】:2018-02-26 21:00:34
【问题描述】:

如果没有元素大于某个值,有什么方法可以让std::max_element 返回end 迭代器?

想象一下我有这个向量:

std::vector<int> vector{3, 6, 2, 5};
auto it = std::max_element(vector.begin(), vector.end());

如果没有元素大于 7,你如何让 it 指向 vector.end()

【问题讨论】:

标签: c++ algorithm vector iterator


【解决方案1】:

我没有看到直接执行此操作的算法,但事后添加它非常简单:

auto temp = std::max_element(v.begin(), v.end());
auto it = (temp ==v.end() || *temp > 7) ? temp : v.end();

【讨论】:

  • 是的,我认为可以这样做,但我不知道是否有办法在一个函数中做到这一点。
  • @PabloRamónGuevara - 在一个函数中执行此操作的方法是自己编写该模板。接受一对迭代器+其他东西并不难,并将v.end()替换为it_last
【解决方案2】:

使用range-v3,您可以这样做:

std::vector<int> v{3, 6, 2, 5};
auto r = v | ranges::view::filter([](auto e){ return e > 7; });
auto it = ranges::max_element(r);
if (it == r.end()) {
    std::cout << "End\n";
} else {
    std::cout << *it << std::endl;   
}

Demo

【讨论】:

  • 谢谢,但我不想使用外部库
  • r.end()v.end()一样吗?
  • @KerrekSB:类型不同。不幸的是,我遇到了it == v.end() 的编译错误。
  • 过滤器的一般问题之一是边界迭代器在源(=未过滤)范围方面可能不明确......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 2015-08-09
  • 1970-01-01
  • 2014-10-26
相关资源
最近更新 更多