0

有没有一种方法可以找到整数向量的最小奇数元素,而无需基本上重新实现std::min_element并且无需进行额外的工作,例如首先计算奇数向量?

4

4 回答 4

2

虽然另一个答案中建议的自定义比较对象将是 std::min_element (特别是类似的)的简单解决方案,但它不适用于所有标准算法。适用于任何标准算法的一般方法是定义自定义迭代器。

定制、组合和扩展标准算法几乎总是可以通过迭代器来实现。从头开始编写自定义迭代器涉及大量样板文件,不幸的是标准没有为许多迭代器适配器提供模板。Boost 确实提供了大量的迭代器适配器模板,在这种情况下boost::filter_iterator应该证明是有用的。


您可以使用范围算法代替更传统的迭代器算法。

从 C++20 开始,有许多用于范围算法的标准范围适配器,它们易于组合:

auto it = std::ranges::min_element(
    container | std::views::filter(condition)
);

请注意,在撰写本文时,只有 libstdc++ 实现了范围标准库。

于 2021-01-19T20:16:34.253 回答
2

C++20 解决方案:

std::vector<int> ints{0, 1, 2, 3, 4, 5};
auto odd = [](int i) { return bool(i % 2); };
auto e = std::ranges::min_element(ints | std::views::filter(odd));
于 2021-01-19T20:25:39.373 回答
1

是的,这不是很难。实现一个自定义比较,将每个偶数元素排序在所有奇数元素之上。您仍然需要按照通常的顺序对奇数元素进行排序,最后检查向量中是否至少有一个奇数元素。

于 2021-01-19T20:06:42.610 回答
1

一个简单的解决方案是使用自定义比较器函数sd::min_element

正如@MSalters 在他们的回答中和@Kevin 在评论中提到的那样,在下面的代码中应该添加的是检查获得的值是否确实是奇怪的。

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> v = {0, 3, 4, 1};
    auto comp = [](int a, int b) {
        if ((a%2) and (b%2 == 0)) return true;
        if ((a%2 == 0) and (b%2)) return false;
        return a < b;
    };
    auto min_odd = std::min_element (v.begin(), v.end(), comp);
    std::cout << *min_odd << std::endl;
}
于 2021-01-19T20:19:21.107 回答