Como posso obter o valor máximo (ou mínimo) em um vetor?

123

Como posso obter o valor máximo (ou mínimo) em um vetor em C ++ ?

Vi algumas soluções para isso no Google, mas nenhuma delas fazia sentido para mim :(

Alguém pode explicar de maneira fácil e direta como obter o valor máximo ou mínimo de um vetor, por favor? e estou errado em supor que seria mais ou menos o mesmo com uma matriz?

Eu preciso de um iterador, certo? Eu tentei max_elementmas continuava recebendo um erro?

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

error: solicitação do membro 'begin' em 'cloud', que não é do tipo de classe 'int [10]'

Edição: Eu não era capaz de responder o meu próprio ?? então eu vou colocar aqui ...

Uau, obrigado pelas respostas rápidas! Acabei fazendo assim, acha que está tudo bem?

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

onde cdfé um vetor

bob blob
fonte
Parece que cloudnão é um contêiner STL, mas sim um int[10]. Basicamente, cloudnão tem um membro .begin(). Pode querer obter um livro básico de C ++, a menos que você esteja fazendo apenas uma coisa.
26412 Chris A.
Um pouco mais de código pode ser útil também. Onde está a definição de nuvem?
26412 Tim Tim
9
@obobblob: e ainda o erro do compilador que você postou disse que "a nuvem é do tipo não pertencente à classe int[10]". Como pode ser um vetor então?
jalf

Respostas:

118

Usando sinalizadores de compilação c ++ 11 / c ++ 0x, você pode

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

Caso contrário, escreva o seu:

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

Veja ao vivo em 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, e usestd::minmax_element(...) se você precisar dos dois ao mesmo tempo: /

ver
fonte
Olá, você sabe que é possível aplicá-lo à matriz ou ao vetor de dimensão?
Charles Chow
3
Sim você pode. Os algoritmos de biblioteca padrão foram projetados para trabalhar genericamente em iteradores. Os ponteiros também são iteradores.
14/08/14
85

Se você deseja usar a função std::max_element(), é necessário:

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

Espero que isso possa ajudar.

Angie Quijano
fonte
10
Por que existe *em *max_element?
Konrad
39
Isso é porque'max_element'returns um iterador
Angie Quijano
Eu acho que você assumiu a entrada como vetor <double> ou * max_element () por padrão retorna double val.
Sameer Kape
14

Deixei,

 #include <vector>

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

Se o vetor estiver classificado em ordem crescente ou decrescente, você poderá encontrá-lo com a complexidade O (1).

Para um vetor de ordem crescente, o primeiro elemento é o menor, você pode obtê-lo por v [0] (indexação baseada em 0) e o último elemento é o maior elemento, você pode obtê-lo por v [sizeOfVector-1].

Se o vetor é classificado em ordem decrescente, o último elemento é o menor, você pode obtê-lo por v [sizeOfVector-1] e o primeiro elemento é o maior, pode obtê-lo por v [0].

Se o vetor não for classificado, você precisará iterar sobre o vetor para obter o elemento menor / maior. Nesse caso, a complexidade do tempo é O (n), aqui n é o tamanho do vetor.

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

Você pode usar o 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;
    }
}

Você pode calculá-lo na seção de entrada (quando precisar encontrar o menor ou o maior elemento de um determinado vetor)

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

Além disso, você pode obter o menor / maior elemento com funções integradas

#include<algorithm>

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

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

Você pode obter o menor / maior elemento de qualquer intervalo usando essas funções. tal 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)

Eu usei asterisco (*), antes das funções min_element () / max_element (). Porque os dois retornam o iterador. Todos os códigos estão em c ++.

Taohidul Islam
fonte
2
min_elemente max_elementretorne um iterador , não um ponteiro. No entanto, para estar tecnicamente correto, um ponteiro é um subconjunto de um iterador. Veja: stackoverflow.com/questions/2728190/…
rayryeng 19/17
Eu atualizei minha resposta. Obrigado pela sua observação.
Taohidul Islam 19/10/19
9

Supondo que a nuvem é int cloud[10]possível: int *p = max_element(cloud, cloud + 10);

Asha
fonte
também vou tentar isso. Eu tentei anteriormente para obter max_element, mas sem amor. obrigado!
bob blob
7

Você pode imprimi-lo diretamente usando a função max_element / min_element. Por exemplo:

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

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

No c ++ 11, você pode usar alguma função como essa:

int maxAt(std::vector<int>& vector_name) {
    int max = INT_MIN;
    for (auto val : vector_name) {
         if (max < val) max = val;
    }
    return max;
}
brenorodrigues
fonte
Como você está fazendo referência ao C ++ 11, é melhor do que usar std::max_elementporque ...?
rayryeng
1

Se você deseja usar um iterador, pode fazer um novo posicionamento com uma matriz.

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

Observe a falta de um () no final, isso é importante. Isso cria uma classe de matriz que usa essa memória como armazenamento e possui recursos STL como iteradores.

(Este é C ++ TR1 / C ++ 11 a propósito)

std''OrgnlDave
fonte
1

Você pode usar max_element para obter o valor máximo em vetor. O max_element retorna um iterador para o maior valor no intervalo, ou último se o intervalo estiver vazio. Como um iterador é como ponteiros (ou você pode dizer que o ponteiro é uma forma de iterador), você pode usar um * antes dele para obter o valor. Portanto, de acordo com o problema, você pode obter o elemento máximo em um vetor como:

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

Ele fornecerá o elemento máximo em seu vetor "nuvem". Espero que ajude.

Prashant Shubham
fonte
0

Só isso:

// 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
fonte
Por que usar macros? Não há razão para isso! O erro começa com int cloud[10];e é o uso de números mágicos.
Ulrich Eckhardt
1
Porque a partir da mensagem de erro, é claro que ele não tem vetor, mas matriz normal. E você precisa contar o seu comprimento de alguma forma, para evitar o uso de números mágicos codificados. Ele pode mudar de tamanho no futuro, mas o código para encontrar o máximo dessa maneira será o mesmo.
precisa saber é o seguinte
Desculpe, isso não ocorreu corretamente. Sua solução está correta, mas ruim. O motivo é que ele pressupõe o uso de números mágicos, que não seguem a mensagem de erro. Em seguida, continua com o uso de macros, que são sempre um cheiro de 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);
}

A maneira nooby completa ... em C

user3907370
fonte
3
Isto responde à questão de como encontrar o valor máximo em uma matriz, não um C ++vector
Andrew Stubbs
Esta pergunta está etiquetada com C ++. Você escreveu esse código em C, mas não apenas isso, você está equiparando um vetor a uma matriz - não está correto. Você também tem declarações de impressão desnecessárias quando precisamos apenas do valor real. Finalmente, todo o código é perturbador. Você só precisa do código no forloop. No geral, uma resposta muito ruim.
rayryeng