¿Cómo puedo obtener el valor máximo (o mínimo) en un vector?

123

¿Cómo puedo obtener el valor máximo (o mínimo) en un vector en C ++ ?

He visto algunas soluciones para esto en Google, pero ninguna de ellas tenía sentido para mí :(

¿Alguien puede explicar de una manera fácil y directa cómo obtener el valor máximo o mínimo de un vector, por favor? ¿y me equivoco al suponer que sería más o menos lo mismo con una matriz?

Necesito un iterador ¿verdad? ¿Lo probé max_elementpero seguí recibiendo un error?

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

error: solicitud de miembro 'begin' en 'cloud', que es del tipo no int '' [10] '

EDITAR: ¿No pude responder la mía? así que lo pondré aquí ...

Wow, gracias por las respuestas rápidas! Terminé haciéndolo de esta manera, ¿crees que está bien?

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

donde cdfes un vector

bob blob
fuente
Parece que cloudno es un contenedor STL, sino más bien un int[10]. Básicamente, cloudno tiene un miembro .begin(). Es posible que desee obtener un libro básico de C ++ a menos que solo esté haciendo esto.
Chris A.
Algún código más podría ser útil también. ¿Dónde está la definición de nube?
Tim
9
@bobblob: y sin embargo, el error del compilador que publicaste decía que "la nube es de tipo no clase int[10]". ¿Cómo puede ser un vector entonces?
jalf

Respuestas:

118

Con los indicadores de compilación de c ++ 11 / c ++ 0x, puede

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

De lo contrario, escriba el suyo:

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

Véalo en vivo en 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';
}

Ah, y úsalostd::minmax_element(...) si necesitas ambos a la vez: /

sehe
fuente
Hola, ¿sabes si es posible aplicarlo a una matriz de dimensiones o un vector?
Charles Chow
3
Sí tu puedes. Los algoritmos estándar de la biblioteca han sido diseñados para funcionar genéricamente en iteradores. Los punteros también son iteradores.
sehe
85

Si desea utilizar la función std::max_element(), la forma en que debe hacerlo es:

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

Espero que esto pueda ayudar.

Angie Quijano
fuente
10
¿Por qué hay *en *max_element?
Konrad
39
Eso es porque "max_element" devuelve un iterador
Angie Quijano
Supongo que ha asumido que la entrada es vector <double> o * max_element () por defecto devuelve double val.
Sameer Kape
14

Dejar,

 #include <vector>

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

Si el vector se ordena en orden ascendente o descendente, puede encontrarlo con la complejidad O (1).

Para un vector de orden ascendente, el primer elemento es el elemento más pequeño, puede obtenerlo por v [0] (indexación basada en 0) y el último elemento es el elemento más grande, puede obtenerlo por v [sizeOfVector-1].

Si el vector se ordena en orden descendente, el último elemento es el elemento más pequeño, puede obtenerlo por v [sizeOfVector-1] y el primer elemento es el elemento más grande, puede obtenerlo por v [0].

Si el vector no está ordenado, debe iterar sobre el vector para obtener el elemento más pequeño / más grande. En este caso, la complejidad del tiempo es O (n), aquí n es el tamaño del vector.

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

Puedes usar iterador,

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

Puede calcularlo en la sección de entrada (cuando tiene que encontrar el elemento más pequeño o más grande de un vector dado)

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

También puede obtener el elemento más pequeño / más grande mediante funciones integradas

#include<algorithm>

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

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

Puede obtener el elemento más pequeño / más grande de cualquier rango utilizando estas funciones. como,

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)

He usado asterisco (*), antes de las funciones min_element () / max_element (). Porque ambos devuelven iterador. Todos los códigos están en c ++.

Taohidul Islam
fuente
2
min_elementy max_elementdevuelve un iterador , no un puntero. Sin embargo, para ser técnicamente correcto, un puntero es un subconjunto de un iterador. Ver: stackoverflow.com/questions/2728190/…
rayryeng
He actualizado mi respuesta. Gracias por tu observación.
Taohidul Islam
9

Suponiendo que la nube es int cloud[10], puedes hacerlo así: int *p = max_element(cloud, cloud + 10);

Asha
fuente
También voy a intentar esto. Intenté antes obtener max_element pero no amor. ¡Gracias!
Bob Blob
7

Puede imprimirlo directamente usando la función max_element / min_element. P.ej:

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

  cout<<*min_element(v.begin(),v.end());
Kishy Nivas
fuente
5

En c ++ 11, puede usar alguna función como esa:

int maxAt(std::vector<int>& vector_name) {
    int max = INT_MIN;
    for (auto val : vector_name) {
         if (max < val) max = val;
    }
    return max;
}
brenorodrigues
fuente
Dado que hace referencia a C ++ 11, esto es mejor que usar std::max_elementporque ...?
rayryeng
1

Si desea utilizar un iterador, puede hacer una nueva ubicación con una matriz.

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

Tenga en cuenta la falta de un ()al final, eso es importante. Esto crea una clase de matriz que usa esa memoria como almacenamiento y tiene características STL como iteradores.

(Esto es C ++ TR1 / C ++ 11 por cierto)

std''OrgnlDave
fuente
1

Puede usar max_element para obtener el valor máximo en vector. Max_element devuelve un iterador al valor más grande en el rango, o último si el rango está vacío. Como un iterador es como punteros (o puede decir que el puntero es una forma de iterador), puede usar un * antes para obtener el valor. Entonces, según el problema, puede obtener el elemento máximo en un vector como:

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

Le dará el elemento máximo en su vector "nube". Espero eso ayude.

Prashant Shubham
fuente
0

Sólo esta:

// 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
fuente
¿Por qué usar macros? ¡No hay razón para eso! El error comienza con int cloud[10];y es el uso de números mágicos.
Ulrich Eckhardt
1
Porque del mensaje de error está claro que no tiene un vector sino una matriz normal. Y tiene que contar su longitud de alguna manera, para evitar el uso de números mágicos codificados. Puede cambiar la longitud en el futuro, pero el código para encontrar el máximo de esta manera será el mismo.
ivan.ukr
Lo siento, eso no se encontró correctamente. Su solución es correcta, pero mala. La razón es que supone el uso de números mágicos, que no se desprenden del mensaje de error. Luego continúa con el uso de macros, que siempre son un olor a código.
Ulrich Eckhardt
-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);
}

La manera más completa ... en C

usuario3907370
fuente
3
Esto responde a la pregunta de cómo encontrar el valor máximo en una matriz, no en C ++vector
Andrew Stubbs
Esta pregunta está etiquetada como C ++. Has escrito este código en C pero no solo eso, estás equiparando un vector a una matriz, no es correcto. También tiene declaraciones de impresión innecesarias cuando solo necesitamos el valor real. Finalmente, todo el código distrae. Solo necesitas el código en el forbucle. En general, una respuesta muy pobre.
rayryeng