Bagaimana saya bisa mendapatkan nilai maks (atau min) dalam vektor?


123

Bagaimana saya bisa mendapatkan nilai max (atau min) dalam vektor di C ++ ?

Saya telah melihat beberapa solusi untuk ini di Google tetapi tidak ada yang masuk akal bagi saya :(

Bisakah seseorang menjelaskan dengan cara noob langsung yang mudah dan mudah bagaimana cara mendapatkan nilai maks atau min dari vektor? dan apakah saya salah dalam mengasumsikan itu akan kurang lebih sama dengan array?

Saya butuh iterator kan? Saya mencobanya max_elementtetapi terus mendapatkan kesalahan?

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

kesalahan: permintaan untuk anggota 'mulai' di 'cloud', yang merupakan tipe non-kelas 'int [10]'

EDIT: Saya tidak dapat menjawab pertanyaan saya sendiri ??? jadi saya akan taruh di sini ...

Wow, terima kasih atas balasannya yang cepat! Saya akhirnya melakukannya dengan cara ini, apakah menurut Anda tidak apa-apa?

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

dimana cdfvektor.


Sepertinya cloudbukan wadah STL, melainkan int[10]. Pada dasarnya, cloudtidak memiliki anggota .begin(). Mungkin ingin mendapatkan buku C ++ dasar kecuali Anda hanya melakukan satu hal ini.
Chris A.

Beberapa kode lagi mungkin berguna juga. Dimana definisi cloud?
Tim

9
@bobblob: namun kesalahan kompiler yang Anda posting mengatakan bahwa "cloud adalah tipe non-kelas int[10]". Bagaimana bisa itu menjadi vektor?
jalf

Jawaban:


118

Dengan menggunakan flag kompilasi c ++ 11 / c ++ 0x, Anda bisa

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

Jika tidak, tulis sendiri:

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

Lihat langsung di 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';
}

Oh, dan gunakanstd::minmax_element(...) jika Anda membutuhkan keduanya sekaligus: /


Hai, tahukah Anda apakah mungkin menerapkannya ke larik dimensi atau vektor?
Charles Chow

3
Ya kamu bisa. Algoritme pustaka standar telah dirancang untuk bekerja secara umum pada iterator. Pointer juga merupakan iterator.
lihat

85

Jika Anda ingin menggunakan fungsi tersebut std::max_element(), cara yang harus Anda lakukan adalah:

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

Saya harap ini bisa membantu.


10
Kenapa ada *di *max_element?
Konrad

39
Itu karena ´max_element´ mengembalikan iterator
Angie Quijano

Saya kira Anda telah mengasumsikan input menjadi vektor <double> atau apakah * max_element () secara default mengembalikan double val.
Sameer Kape

14

Membiarkan,

 #include <vector>

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

Jika vektor diurutkan dalam urutan menaik atau menurun maka Anda dapat menemukannya dengan kompleksitas O (1).

Untuk vektor dengan urutan menaik, elemen pertama adalah elemen terkecil, Anda bisa mendapatkannya dengan v [0] (pengindeksan berbasis 0) dan elemen terakhir adalah elemen terbesar, Anda bisa mendapatkannya dengan v [sizeOfVector-1].

Jika vektor diurutkan dalam urutan menurun maka elemen terakhir adalah elemen terkecil, Anda bisa mendapatkannya dengan v [sizeOfVector-1] dan elemen pertama adalah elemen terbesar, Anda bisa mendapatkannya dengan v [0].

Jika vektor tidak diurutkan maka Anda harus melakukan iterasi pada vektor untuk mendapatkan elemen terkecil / terbesar. Dalam hal ini kompleksitas waktu adalah O (n), di sini n adalah ukuran vektor.

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

Anda dapat menggunakan iterator,

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

Anda dapat menghitungnya di bagian input (ketika Anda harus menemukan elemen terkecil atau terbesar dari vektor tertentu)

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

Anda juga bisa mendapatkan elemen terkecil / terbesar dengan fungsi bawaan

#include<algorithm>

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

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

Anda bisa mendapatkan elemen terkecil / terbesar dari rentang apa pun dengan menggunakan fungsi ini. seperti,

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)

Saya telah menggunakan asterisk (*), sebelum fungsi min_element () / max_element (). Karena keduanya mengembalikan iterator. Semua kode dalam c ++.


2
min_elementdan max_elementmengembalikan iterator , bukan pointer. Namun, untuk menjadi benar secara teknis sebuah pointer adalah bagian dari iterator. Lihat: stackoverflow.com/questions/2728190/…
rayryeng

Saya telah memperbarui jawaban saya. Terima kasih atas observasi Anda.
Taohidul Islam

9

Dengan asumsi cloud, int cloud[10]Anda dapat melakukannya seperti ini: int *p = max_element(cloud, cloud + 10);


juga akan mencoba ini. Saya mencoba sebelumnya untuk mendapatkan max_element tetapi tidak ada cinta. Terima kasih!
bob blob

7

Anda dapat mencetaknya langsung menggunakan fungsi max_element / min_element. Misalnya:

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

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

5

Di c ++ 11, Anda dapat menggunakan beberapa fungsi seperti itu:

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

Karena Anda mereferensikan C ++ 11, ini lebih baik daripada menggunakan std::max_elementkarena ...?
rayryeng

1

Jika ingin menggunakan iterator, Anda bisa melakukan penempatan-baru dengan array.

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

Perhatikan kekurangan file () di akhir, itu penting. Ini membuat kelas array yang menggunakan memori itu sebagai penyimpanannya, dan memiliki fitur STL seperti iterator.

(Omong-omong, ini adalah C ++ TR1 / C ++ 11)


1

Anda dapat menggunakan max_element untuk mendapatkan nilai maksimum dalam vektor. Max_element mengembalikan iterator ke nilai terbesar dalam rentang, atau terakhir jika rentang kosong. Karena iterator seperti pointer (atau Anda dapat mengatakan pointer adalah bentuk iterator), Anda dapat menggunakan * sebelum itu untuk mendapatkan nilainya. Jadi sesuai masalah Anda bisa mendapatkan elemen maksimum dalam vektor sebagai:

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

Ini akan memberi Anda elemen maksimum dalam vektor "awan" Anda. Semoga membantu.


0

Hanya ini:

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

Mengapa menggunakan makro? Tidak ada alasan untuk itu! Kesalahan dimulai dengan int cloud[10];dan itu adalah penggunaan angka ajaib.
Ulrich Eckhardt

1
Karena dari pesan error terlihat jelas bahwa ia bukan vector melainkan array normal. Dan Anda harus menghitung panjangnya entah bagaimana, untuk menghindari penggunaan nomor ajaib hardcode. Dia mungkin berubah panjang di masa depan, tetapi kode untuk menemukan maksimum dengan cara ini akan sama.
ivan.ukr

Maaf, jawaban Anda salah. Solusi Anda benar, tapi buruk. Alasannya adalah karena mengasumsikan penggunaan angka ajaib, yang tidak mengikuti dari pesan kesalahan. Ini kemudian berlanjut dengan penggunaan makro, yang selalu merupakan bau kode.
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);
}

Cara nooby lengkap ... di C


3
Ini menjawab pertanyaan tentang bagaimana menemukan nilai maks dalam sebuah array, bukan C ++vector
Andrew Stubbs

Pertanyaan ini diberi tag C ++. Anda telah menulis kode ini dalam C tetapi tidak hanya itu, Anda juga menyamakan vektor dengan array - tidak benar. Anda juga memiliki pernyataan cetak yang tidak perlu ketika kami hanya membutuhkan nilai sebenarnya. Akhirnya, seluruh kode mengganggu. Anda hanya perlu kode di forloop. Secara keseluruhan, jawaban yang sangat buruk.
rayryeng
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.