如何在不进行多次通过(C )的情况下找到最小的所有元素

How to find all elements which are minimal within a range without doing several pass(c++)

本文关键字:情况下 元素      更新时间:2023-10-16

我们可以使用算法库中的函数std :: min_element将最小元素在范围内获取。

#include <algorithm>
#include <vector>
std::vector<int> v{3, 1, 4, 1, 5, 9};
std::vector<int>::iterator it = std::min_element(std::begin(v), std::end(v));

迭代器" it"指向向量中的第二个元素。

是否可以获取所有最小元素(此处v [1]和v [3]),而不会在容器上迭代几次?

谢谢

当然是可能的,但不能使用std::min_element

类似的东西:

template<typename ITER>
std::vector<ITER> find_all_min(ITER begin, ITER end){
    auto min = *begin;
    std::vector<ITER> ret{ begin };
    for (++begin; begin != end; ++begin) {
        if (*begin < min) {
            min = *begin;
            ret.clear();
            ret.push_back(begin);
        } else if (*begin == min) {
            ret.push_back(begin);
        }
    }
    return ret;
}

我的示例假设begin < end

我们只是在容器上迭代,找到最小元素,记住它是迭代器,然后放在迭代器的向量上。

std::min_element的复杂性是线性的,这意味着它不会迭代多次。

相关文章: