使用std :: min_element,std :: max_element查找向量中的最小和最大元素

时间:2018-09-16 19:20:47

标签: c++ stl

我是C ++的新手,我试图找到std::vector的最小和最大元素,但是std::min_element()std::max_element()不能一起工作。给定的输出仅为最小值。在输出中,仅将最小值打印两次,而不是先打印最小值然后再打印最大值。

#include <iostream> 
#include <algorithm> 
#include <vector>
using namespace std;

bool comp1_(int a, int b) 
{ 
    return a > b; 
}

bool comp2(int a, int b) 
{ 
    return a < b; 
}

int main() 
{ 
    vector<int> myvector;
    vector<int>::iterator i1;
    vector<int>::iterator i2;
    int n, num;
    cin >> n;
    for(int i = 0; i < n; i++){
        cin >> num;
        myvector.push_back(num);
    }
    i2 = std::min_element(myvector.begin(), myvector.end(), comp2);
    cout << *i2 << " ";
    i1 = std::max_element(myvector.begin(), myvector.end(), comp1_); 
    cout << *i1; 
    return 0; 
} 

3 个答案:

答案 0 :(得分:3)

您的问题仅仅是因为您错误地使用了max_element。如果第一个参数小于第二个参数,则期望比较返回true。在这两种情况下,您都将需要使用comp2_。因此,在您的程序中,它应该显示为

i1 = std::max_element(myvector.begin(), myvector.end(), comp2); 

实现您想要的目标的最佳做法是使用minmax_element,如提到的Jesper

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


bool compLess(int a, int b)
{
    return (a < b);
}

int main()
{
    using namespace std;
    vector<int> myvector;

    int n, num;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> num;
        myvector.push_back(num);
    }

    auto minmax = std::minmax_element(myvector.begin(), myvector.end(), compLess);
    cout << "min: " << *minmax.first << "\tmax:" << *minmax.second << "\n";
    return 0;
}

有了这个,您不必遍历数组两次。

提示请勿在全局名称空间中使用using namespace std;。我认为这是不好的做法。

答案 1 :(得分:0)

i1 = std::max_element(myvector.begin(), myvector.end(), comp1_); 

错了

i1 = std::max_element(myvector.begin(), myvector.end(), comp2); 

会工作的。

通过将comp1_max_element一起使用,您实际上是在询问最小元素,因为max_element会找到comp1_(x,y)对于任何y都不为真的元素x。

您实际上已经做了一个双重否定,您已经切换到要求最大的元素,但是还反转了您切换到再次要求最小的比较功能。

使用min_elementmax_element时应该做的就是传递一个比较函数,表示“小于”,然后这些函数将按照它们说的去做。

您现在可能意识到

i2 = std::min_element(myvector.begin(), myvector.end(), comp1_);

会让您获得最大的收获。

答案 2 :(得分:0)

您还需要使用comp2来调用std :: max_element。 min_element和max_element的比较运算符相同。

或者,您也可以使用     i1 = std::min_element(myvector.begin(), myvector.end(), comp1_);

也请检出https://en.cppreference.com/w/cpp/algorithm/max_element