对 std::max_element 施加条件
Posted
技术标签:
【中文标题】对 std::max_element 施加条件【英文标题】:Impose a condition on std::max_element 【发布时间】:2018-02-26 21:00:34 【问题描述】:如果没有元素大于某个值,有什么方法可以让std::max_element
返回end
迭代器?
想象一下我有这个向量:
std::vector<int> vector3, 6, 2, 5;
auto it = std::max_element(vector.begin(), vector.end());
如果没有元素大于 7,你如何让 it
指向 vector.end()
?
【问题讨论】:
boost::filter_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> v3, 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()
的编译错误。
过滤器的一般问题之一是边界迭代器在源(=未过滤)范围方面可能不明确......以上是关于对 std::max_element 施加条件的主要内容,如果未能解决你的问题,请参考以下文章