поиск элементов min и max в векторе с использованием std :: min_element, std :: max_element - PullRequest
0 голосов
/ 16 сентября 2018

Я новичок в 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 голосов
/ 16 сентября 2018

Вам также необходимо использовать 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.

0 голосов
/ 16 сентября 2018

Ваша проблема просто в том, что вы используете max_element неправильно.Ожидается сравнение, которое возвращает true, если первый аргумент меньше второго.Вам нужно будет использовать comp2_ в обоих случаях.Так что в вашей программе это должно выглядеть так:

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

Лучшая практика для достижения того, что вы хотите использует 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 голосов
/ 16 сентября 2018
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) неверно для любого y.

Вы фактически сделали двойной отрицательный результат, вы переключились на запрос максимального элемента, но также изменили функцию сравнения, которую вы переключили на запрос минимума снова.

Что вы должны сделать при использовании min_element и max_element - передать функцию сравнения, которая означает «меньше чем», тогда эти функции будут делать то, что говорят.

Теперь вы можете понять, что

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

даст вам максимальный элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...