簡體   English   中英

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

[英]finding the min and max element in vector using std::min_element, std::max_element

我是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; 
} 

您的問題很簡單,就是您錯誤地使用了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; 在全局名稱空間中。 我認為這是不好的做法。

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

是錯的

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

會工作。

通過使用comp1_max_element你實際上要求的最低元素,因為max_element發現元素x為其comp1_(X,Y)不是任何ÿ如此。

您實際上已經做了一個雙重否定,您已經切換到要求最大的元素,但同時也反轉了您切換到再次要求最小的比較函數。

使用min_elementmax_element時應該做的是通過一個比較函數,該函數表示“小於”,然后這些函數將按照它們說的去做。

您現在可能意識到

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

將為您提供最大的元素。

您還需要使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM