C++ 如何在不进行多次传递(c+;+;)的情况下找到范围内最小的所有元素

C++ 如何在不进行多次传递(c+;+;)的情况下找到范围内最小的所有元素,c++,containers,C++,Containers,我们可以使用算法库中的函数std::min_元素来获得一个范围内的最小元素 #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)); #包括 #包括 std::向量v{3,1,4,1,5,9}; s

我们可以使用算法库中的函数std::min_元素来获得一个范围内的最小元素

#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));
#包括
#包括
std::向量v{3,1,4,1,5,9};
std::vector::iterator it=std::min_元素(std::begin(v),std::end(v));
迭代器“it”指向向量中的第二个元素

有没有可能在容器上不迭代几次就得到所有最小元素(这里是v[1]和v[3])


谢谢。

std::min_元素的复杂性意味着它不会重复多次。

std::min_元素的复杂性意味着它不会重复多次。

当然这是可能的,但不能使用
std::min_元素。

大概是这样的:

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;
}
模板
标准::矢量查找所有最小值(ITER开始,ITER结束){
自动最小值=*开始;
std::向量ret{begin};
对于(++begin;begin!=end;++begin){
如果(*开始<分钟){
min=*开始;
ret.clear();
向后推(开始);
}else if(*开始==分钟){
向后推(开始);
}
}
返回ret;
}
我的示例假设
开始


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

当然可以,但不能使用
std::min_元素。

大概是这样的:

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;
}
模板
标准::矢量查找所有最小值(ITER开始,ITER结束){
自动最小值=*开始;
std::向量ret{begin};
对于(++begin;begin!=end;++begin){
如果(*开始<分钟){
min=*开始;
ret.clear();
向后推(开始);
}else if(*开始==分钟){
向后推(开始);
}
}
返回ret;
}
我的示例假设
开始


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

您不理解这个问题。您不理解这个问题。好的,谢谢。但是没有办法利用可用的algo?他们已经提供了定义您自己的比较器的设计(我知道我可以修改您编写的内容,我正在寻找最“自然”的方法)@stackoverflower您可以确定最小元素,就像您所做的那样,然后使用find_if再次迭代向量。但这是2次迭代,而我的解决方案是1次,正如您所要求的。好的,谢谢。但是没有办法利用可用的algo?他们已经提供了定义您自己的比较器的设计(我知道我可以修改您编写的内容,我正在寻找最“自然”的方法)@stackoverflower您可以确定最小元素,就像您所做的那样,然后使用find_if再次迭代向量。但这是2次迭代,而我的解决方案是1次,正如您所要求的。