Как я могу получить максимальное (или минимальное) значение в векторе?

124

Как я могу получить максимальное (или минимальное) значение в векторе на C ++ ?

Я видел несколько решений для этого в Google, но ни одно из них не имело для меня смысла :(

Может ли кто-нибудь объяснить простым и понятным способом, как получить максимальное или минимальное значение из вектора, пожалуйста? и я ошибаюсь, предполагая, что это будет более или менее то же самое с массивом?

Мне нужен итератор, верно? Я пробовал, max_elementно продолжал получать ошибку?

vector<int>::const_iterator it;
it = max_element(cloud.begin(), cloud.end());

ошибка: запрос на член "begin" в "облаке" неклассового типа "int [10]"

РЕДАКТИРОВАТЬ: Я не смог ответить на свой вопрос ??? так что положу сюда ...

Вау, спасибо за быстрые ответы! Я закончил тем, что сделал это, как думаешь, это нормально?

for (unsigned int i = 0; i < cdf.size(); i++)
  if (cdf[i] < cdfMin)
    cdfMin = cdf[i];

где cdfвектор.

боб капля
источник
Похоже, cloudэто не контейнер STL, а скорее int[10]. По сути, cloudне имеет члена .begin(). Возможно, вам захочется получить базовую книгу по C ++, если вы не занимаетесь только этим.
Крис А.
Также может пригодиться еще немного кода. Где определение облака?
Тим
9
@bobblob: и все же в опубликованной вами ошибке компилятора говорилось, что «облако неклассового типа int[10]». Как же тогда это может быть вектор?
jalf

Ответы:

120

Используя флаги компиляции c ++ 11 / c ++ 0x, вы можете

auto it = max_element(std::begin(cloud), std::end(cloud)); // c++11

В противном случае напишите свой:

template <typename T, size_t N> const T* mybegin(const T (&a)[N]) { return a; }    
template <typename T, size_t N> const T* myend  (const T (&a)[N]) { return a+N; }

Смотрите в прямом эфире на http://ideone.com/aDkhW :

#include <iostream>
#include <algorithm>

template <typename T, size_t N> const T* mybegin(const T (&a)[N]) { return a; }    
template <typename T, size_t N> const T* myend  (const T (&a)[N]) { return a+N; }

int main()
{
    const int cloud[] = { 1,2,3,4,-7,999,5,6 };

    std::cout << *std::max_element(mybegin(cloud), myend(cloud)) << '\n';
    std::cout << *std::min_element(mybegin(cloud), myend(cloud)) << '\n';
}

Да, и используйте,std::minmax_element(...) если вам нужны оба сразу: /

sehe
источник
Привет, вы знаете, можно ли применить его к массиву измерений или вектору?
Чарльз Чоу
3
Да, ты можешь. Алгоритмы стандартной библиотеки были разработаны для общей работы с итераторами. Указатели также являются итераторами.
sehe
85

Если вы хотите использовать эту функцию std::max_element(), вам нужно сделать это:

double max = *max_element(vector.begin(), vector.end());
cout<<"Max value: "<<max<<endl;

Надеюсь, это поможет.

Энджи Кихано
источник
10
Почему есть *в *max_element?
Конрад
40
Это потому, что «max_element» возвращает итератор
Энджи Кихано
Я предполагаю, что вы предположили, что input является вектором <double> или * max_element () по умолчанию возвращает double val.
Самир Капе,
14

Позволять,

 #include <vector>

 vector<int> v {1, 2, 3, -1, -2, -3};

Если вектор отсортирован в порядке возрастания или убывания, вы можете найти его со сложностью O (1).

Для вектора в порядке возрастания первый элемент - это наименьший элемент, вы можете получить его по v [0] (индексирование на основе 0), а последний элемент - самый большой элемент, вы можете получить его по v [sizeOfVector-1].

Если вектор отсортирован в порядке убывания, то последний элемент является наименьшим элементом, вы можете получить его по v [sizeOfVector-1], а первый элемент - это самый большой элемент, вы можете получить его по v [0].

Если вектор не отсортирован, вам нужно перебрать вектор, чтобы получить наименьший / наибольший элемент. В этом случае временная сложность составляет O (n), здесь n - размер вектора.

int smallest_element = v[0]; //let, first element is the smallest one
int largest_element = v[0]; //also let, first element is the biggest one
for(int i = 1; i < v.size(); i++)  //start iterating from the second element
{
    if(v[i] < smallest_element)
    {
       smallest_element = v[i];
    }
    if(v[i] > largest_element)
    {
       largest_element = v[i];
    }
}

Вы можете использовать итератор,

for (vector<int>:: iterator it = v.begin(); it != v.end(); it++)
{
    if(*it < smallest_element) //used *it (with asterisk), because it's an iterator
    {
      smallest_element = *it;
    }
    if(*it > largest_element)
    {
      largest_element = *it;
    }
}

Вы можете вычислить его в разделе ввода (когда вам нужно найти наименьший или наибольший элемент из заданного вектора)

int smallest_element, largest_element, value;
vector <int> v;
int n;//n is the number of elements to enter
cin >> n;
for(int i = 0;i<n;i++)
{
    cin>>value;
    if(i==0)
    {
        smallest_element= value; //smallest_element=v[0];
        largest_element= value; //also, largest_element = v[0]
    }

    if(value<smallest_element and i>0)
    {
        smallest_element = value;
    }

    if(value>largest_element and i>0)
    {
        largest_element = value;
    }
    v.push_back(value);
}

Также вы можете получить самый маленький / самый большой элемент с помощью встроенных функций

#include<algorithm>

int smallest_element = *min_element(v.begin(),v.end());

int largest_element  = *max_element(v.begin(),v.end());

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

vector<int> v {1,2,3,-1,-2,-3};

cout << *min_element(v.begin(), v.begin() + 3); //this will print 1,smallest element of first three elements

cout << *max_element(v.begin(), v.begin() + 3); //largest element of first three elements

cout << *min_element(v.begin() + 2, v.begin() + 5); // -2, smallest element between third and fifth element (inclusive)

cout << *max_element(v.begin() + 2, v.begin()+5); //largest element between third and first element (inclusive)

Я использовал звездочку (*) перед функциями min_element () / max_element (). Потому что оба они возвращают итератор. Все коды написаны на c ++.

Таохидул Ислам
источник
2
min_elementи max_elementвернуть итератор , а не указатель. Однако, чтобы быть технически правильным, указатель - это подмножество итератора. См .: stackoverflow.com/questions/2728190/…
rayryeng
Я обновил свой ответ. Спасибо за ваше наблюдение.
Taohidul Islam
9

Предполагая, что облако - это int cloud[10]вы можете сделать это так: int *p = max_element(cloud, cloud + 10);

Аша
источник
Я тоже попробую это. Я пытался раньше получить max_element, но без любви. Спасибо!
bob blob
7

Вы можете распечатать его напрямую, используя функцию max_element / min_element. Например:

  cout<<*max_element(v.begin(),v.end());

  cout<<*min_element(v.begin(),v.end());
Киши Нивас
источник
5

В С ++ 11 вы можете использовать такую ​​функцию:

int maxAt(std::vector<int>& vector_name) {
    int max = INT_MIN;
    for (auto val : vector_name) {
         if (max < val) max = val;
    }
    return max;
}
brenorodrigues
источник
Поскольку вы ссылаетесь на C ++ 11, это лучше, чем использовать, std::max_elementпотому что ...?
rayryeng
1

Если вы хотите использовать итератор, вы можете выполнить новое размещение с массивом.

std::array<int, 10> icloud = new (cloud) std::array<int,10>;

Обратите внимание на отсутствие ()в конце, это важно. Это создает класс массива, который использует эту память в качестве хранилища и имеет такие функции STL, как итераторы.

(Кстати, это C ++ TR1 / C ++ 11)

std''OrgnlDave
источник
1

Вы можете использовать max_element, чтобы получить максимальное значение в векторе. Max_element возвращает итератор к наибольшему значению в диапазоне или к последнему, если диапазон пуст. Поскольку итератор похож на указатели (или вы можете сказать, что указатель - это форма итератора), вы можете использовать * перед ним, чтобы получить значение. Итак, в соответствии с проблемой вы можете получить максимальный элемент в векторе как:

int max=*max_element(cloud.begin(), cloud.end());

Это даст вам максимальный элемент в вашем векторном «облаке». Надеюсь, поможет.

Прашант Шубхам
источник
0

Просто это:

// assuming "cloud" is:
// int cloud[10]; 
// or any other fixed size

#define countof(x) (sizeof(x)/sizeof((x)[0]))

int* pMax = std::max_element(cloud, cloud + countof(cloud));
ivan.ukr
источник
Зачем нужны макросы? Для этого нет причин! Ошибка начинается с int cloud[10];использования магических чисел.
Ульрих Экхардт
1
Потому что из сообщения об ошибке видно, что у него не векторный, а нормальный массив. И вам нужно как-то посчитать его длину, чтобы не использовать жестко запрограммированные магические числа. В будущем он может изменить длину, но код для нахождения максимума таким образом будет таким же.
ivan.ukr 07
Извините, это не правильно. Ваше решение правильное, но плохое. Причина в том, что он предполагает использование магических чисел, что не следует из сообщения об ошибке. Затем он продолжает использовать макросы, которые всегда являются запахом кода.
Ульрих Экхардт
-5
#include <stdlib.h>
#include <stdio.h>

int main()
{

    int vector[500];

    vector[0] = 100;
    vector[1] = 2;
    vector[2] = 1239;
    vector[3] = 5;
    vector[4] = 10;
    vector[5] = 1;
    vector[6] = 123;
    vector[7] = 1000;
    vector[8] = 9;
    vector[9] = 123;
    vector[10] = 10;

    int i = 0;

    int winner = vector[0];

    for(i=0;i < 10; i++)
    {
        printf("vector = %d \n", vector[i]);

        if(winner > vector[i])
        {
            printf("winner was %d \n", winner);
            winner = vector[i];
            printf("but now is %d \n", winner);
        }
    }

    printf("the minimu is %d", winner);
}

Полный путь ... в C

user3907370
источник
3
Это отвечает на вопрос, как найти максимальное значение в массиве, а не в C ++vector
Эндрю Стаббс
Этот вопрос помечен как C ++. Вы написали этот код на C, но не только это, вы приравниваете вектор к массиву - неправильно. У вас также есть ненужные операторы печати, когда нам просто нужно фактическое значение. Наконец, весь код отвлекает. Вам просто нужен код в forцикле. В целом, очень плохой ответ.
rayryeng