使用std :: min_element,std :: max_element在向量中查找min和max元素

问题描述 投票:2回答:3

我是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; 
} 
c++ stl
3个回答
0
投票
i1 = std::max_element(myvector.begin(), myvector.end(), comp1_); 

是错的

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

会工作。

通过使用comp1_max_element,你实际上要求最小元素,因为max_element找到元素x,对于任何y,comp1_(x,y)都不是真的。

你已经有效地做了一个双重否定,你已经切换到要求最大元素,但也通过反转你已经切换到再次要求最小值的比较函数。

使用min_elementmax_element时应该做的是传递比较函数,意思是“小于”,然后这些函数将按照他们的说法进行。

你现在可能意识到这一点

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

会得到你最大的元素。


3
投票

你的问题只是你错误地使用max_element。它期望一个比较,如果第一个参数小于第二个参数,则返回true。在这两种情况下,您都需要使用comp2_。所以在你的程序中应该阅读

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

达到你想要的最好的做法是使用像Jesper提到的minmax_element

#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;。我认为这是不好的做法。


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

© www.soinside.com 2019 - 2024. All rights reserved.