对 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 施加条件的主要内容,如果未能解决你的问题,请参考以下文章

在二维矩阵上使用 std::max_element

std::max_element

在 vector<double> 上使用 std::max_element

abaqus二维模型怎么施加重力荷载,是对整个模型吗

对缓冲区大小施加限制

在浮子上施加(某些情况下)周期性边界条件的有效方法?