Як я можу отримати вектор (або хв) значення у векторі?


123

Як я можу отримати значення max (або min) у векторі в C ++ ?

Я бачив декілька рішень для цього в Google, але жодне з них не мало для мене сенсу :(

Чи може хтось пояснити простим прямим способом noob, як отримати значення max або min з вектора будь ласка? і я помиляюся, вважаючи, що це буде більш-менш однаково з масивом?

Мені потрібен ітератор? Я спробував це, max_elementале продовжував отримувати помилку?

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

помилка: запит на член 'begin' у 'хмарі', який некласового типу 'int [10]'

EDIT: Я не зміг відповісти на свій власний ??? тому я покладу його сюди ...

Нічого, дякую за швидкі відповіді! Я в кінцевому підсумку робив це так, чи думаєте, що це нормально?

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]". Як це тоді може бути вектором?
джельф

Відповіді:


118

Використовуючи 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(...) якщо вам потрібно обоє відразу: /


Привіт, чи знаєте ви, чи можна застосувати його до розмірного масиву чи вектора?
Чарльз Чоу

3
Так, ти можеш. Стандартні алгоритми бібліотеки були розроблені для загальної роботи над ітераторами. Покажчики теж є ітераторами.
вересня

85

Якщо ви хочете скористатися функцією std::max_element(), це потрібно зробити так:

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

Я сподіваюся, що це може допомогти.


10
Чому є *в *max_element?
Конрад

39
Це тому, що "Max_element" повертає ітератор
Енджі Кіджано

Я думаю, ви вважали, що вхід є векторним <double> або має * max_element () за замовчуванням повернути подвійний 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

Я оновив свою відповідь. Дякуємо за ваше спостереження.
Таохідул Іслам

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

У мові c ++ 11 можна скористатись такою функцією:

int maxAt(std::vector<int>& vector_name) {
    int max = INT_MIN;
    for (auto val : vector_name) {
         if (max < val) max = val;
    }
    return max;
}

Оскільки ви посилаєтесь на C ++ 11, це краще, ніж використовувати, std::max_elementтому що ...?
rayryeng

1

Якщо ви хочете використовувати ітератор, ви можете зробити нове розташування з масивом.

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

Зверніть увагу на відсутність в ()кінці, що важливо. Це створює клас масиву, який використовує цю пам'ять як сховище та має функції STL, подібні до ітераторів.

(Це, до речі, C ++ TR1 / C ++ 11)


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));

Навіщо використовувати макроси? Причин для цього немає! Помилка починається з, int cloud[10];і це використання магічних чисел.
Ульріх Екхардт

1
Тому що з повідомлення про помилку видно, що він має не векторний, а звичайний масив. І вам доведеться якось рахувати його довжину, щоб уникнути використання жорстко закодованих магічних чисел. Він може змінити довжину в майбутньому, але код для пошуку максимуму таким чином буде однаковим.
ivan.ukr

Вибачте, що вийшло не правильно. Ваше рішення правильне, але погане. Причина полягає в тому, що він передбачає використання магічних чисел, що не випливає з повідомлення про помилку. Потім це продовжується із використанням макросів, які завжди кодовим запахом.
Ульріх Екхардт

-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);
}

Повний шлях ... в С


3
Це відповідає на питання, як знайти максимальне значення в масиві, а не на C ++vector
Andrew Stubbs

Це питання позначено тегом C ++. Ви написали цей код на C, але не тільки це, ви прирівнюєте вектор до масиву - не правильно. Ви також маєте зайві заяви про друк, коли нам просто потрібне фактичне значення. Нарешті, весь код відволікає. Вам просто потрібен код у forциклі. Загалом, дуже погана відповідь.
rayryeng
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.