Bir vektördeki maksimum (veya minimum) değeri nasıl elde edebilirim?


123

C ++ 'da bir vektördeki maksimum (veya minimum) değeri nasıl alabilirim ?

Google'da bunun için birkaç çözüm gördüm ama hiçbiri bana mantıklı gelmedi :(

Biri bir vektörden maksimum veya minimum değeri nasıl elde edeceğini kolay ve basit bir şekilde açıklayabilir mi? ve bir dizi ile aşağı yukarı aynı olacağını varsaymakta hatalı mıyım?

Bir yineleyiciye ihtiyacım var değil mi? Denedim max_elementama hata almaya devam ettim ?

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

hata: sınıf tipi olmayan 'int [10]' olan 'bulut'ta' üye 'isteği

DÜZENLEME: Kendi cevap veremedim ??? bu yüzden buraya koyacağım ...

Vay canına, hızlı cevaplar için teşekkürler! Bunu bu şekilde yaptım, tamam mı dersin?

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

cdfvektör nerede .


Görünüşe göre cloudbir STL kapsayıcı değil, bir int[10]. Temelde cloudbir üyesi yok .begin(). Sadece bunu yapmadığınız sürece basit bir C ++ kitabı almak isteyebilirsiniz.
Chris A.

Daha fazla kod da yararlı olabilir. Bulutun tanımı nerede?
Tim

9
@bobblob: ve yine de gönderdiğiniz derleyici hatası "bulutun sınıf dışı tipte olduğunu int[10]" söyledi. O halde nasıl bir vektör olabilir?
jalf

Yanıtlar:


118

C ++ 11 / c ++ 0x derleme bayraklarını kullanarak şunları yapabilirsiniz:

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

Aksi takdirde, kendi ifadenizi yazın:

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

O canlı görü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';
}

Oh, ve ikisine birden ihtiyacınız varsa kullanınstd::minmax_element(...) : /


Merhaba, bunu boyut dizisine veya vektöre uygulamanın mümkün olduğunu biliyor musunuz?
Charles Chow

3
Evet yapabilirsin. Standart kütüphane algoritmaları, genel olarak yineleyiciler üzerinde çalışmak üzere tasarlanmıştır. İşaretçiler de yineleyicilerdir.
sehe

85

İşlevi kullanmak istiyorsanız std::max_element(), yapmanız gereken yol:

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

Umarım bu yardımcı olabilir.


10
Neden var *içinde *max_element?
Konrad

39
Bunun nedeni, "max_element" in bir yineleyiciye dönmesidir
Angie Quijano

Sanırım girdinin <double> vektörü olduğunu varsaymışsınız veya * max_element () varsayılan olarak double val döndürüyor.
Sameer Kape

14

İzin Vermek,

 #include <vector>

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

Vektör artan veya azalan sırada sıralanırsa, onu karmaşıklık O (1) ile bulabilirsiniz.

Artan sıralı bir vektör için ilk eleman en küçük elemandır, bunu v [0] (0 tabanlı indeksleme) ile elde edebilirsiniz ve son eleman en büyük elemandır, v [sizeOfVector-1] ile elde edebilirsiniz.

Vektör azalan sırada sıralanırsa, son eleman en küçük elemandır, onu v [sizeOfVector-1] ile elde edebilirsiniz ve ilk eleman en büyük elemandır, onu v [0] ile elde edebilirsiniz.

Vektör sıralanmamışsa, en küçük / en büyük elemanı elde etmek için vektör üzerinde yineleme yapmanız gerekir. Bu durumda zaman karmaşıklığı O (n), burada n vektörün boyutudur.

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

Yineleyiciyi kullanabilirsiniz,

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

Giriş bölümünde hesaplayabilirsiniz (belirli bir vektörden en küçük veya en büyük elemanı bulmanız gerektiğinde)

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

Ayrıca yerleşik işlevlerle en küçük / en büyük elemanı elde edebilirsiniz

#include<algorithm>

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

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

Bu işlevleri kullanarak herhangi bir aralığın en küçük / en büyük elemanını elde edebilirsiniz. gibi,

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 () işlevlerinden önce yıldız (*) kullandım. Çünkü ikisi de yineleyici döndürür. Tüm kodlar c ++ 'dır.


2
min_elementve bir işaretçi değil, max_elementbir yineleyici döndürür . Bununla birlikte, teknik olarak doğru olması için bir işaretçi, bir yineleyicinin bir alt kümesidir. Bakınız: stackoverflow.com/questions/2728190/…
rayryeng

Cevabımı güncelledim. Gözlemleriniz için teşekkür ederim.
Taohidul Islam

9

Bulutun int cloud[10]bunu şu şekilde yapabileceğini varsayarsak : int *p = max_element(cloud, cloud + 10);


bunu da deneyeceğim. daha önce max_element almayı denedim ama aşk yok. Teşekkürler!
bob blob

7

Max_element / min_element işlevini kullanarak doğrudan yazdırabilirsiniz. Örneğin:

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

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

5

C ++ 11'de, bunun gibi bazı işlevleri kullanabilirsiniz:

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'e başvurduğunuza göre, bu kullanmaktan daha iyidir std::max_elementçünkü ...?
rayryeng

1

Yineleyici kullanmak istiyorsanız, bir dizi ile yeni bir yerleşim yapabilirsiniz .

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

()Sonunda a eksikliğine dikkat edin, bu önemlidir. Bu, belleği deposu olarak kullanan ve yineleyiciler gibi STL özelliklerine sahip bir dizi sınıfı oluşturur.

(Bu arada C ++ TR1 / C ++ 11)


1

Vektördeki maksimum değeri elde etmek için max_element kullanabilirsiniz. Max_element, aralıktaki en büyük değere bir yineleyici döndürür veya aralık boşsa sonuncu. Yineleyici işaretçiler gibi olduğundan (veya işaretçinin bir yineleyici biçimi olduğunu söyleyebilirsiniz), değeri almak için ondan önce * kullanabilirsiniz. Dolayısıyla, probleme göre, bir vektördeki maksimum elemanı şu şekilde elde edebilirsiniz:

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

Size "bulut" vektörünüzdeki maksimum öğeyi verecektir. Umarım yardımcı olur.


0

Sadece bu:

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

Makrolar neden kullanılmalı? Bunun için bir sebep yok! Hata ile başlar int cloud[10];ve sihirli sayıların kullanılmasıdır.
Ulrich Eckhardt

1
Çünkü hata mesajından vektöre değil normal diziye sahip olduğu açıktır. Ve kodlanmış sihirli sayıları kullanmaktan kaçınmak için uzunluğunu bir şekilde saymanız gerekir. Gelecekte uzunluğu değişebilir, ancak bu yolla maksimumu bulmak için kod aynı olacaktır.
ivan.ukr

Maalesef bu doğru bir şekilde görülmedi. Çözümünüz doğru ama kötü. Bunun nedeni, hata mesajından kaynaklanmayan sihirli sayıların kullanıldığını varsaymasıdır. Daha sonra her zaman bir kod kokusu olan makroların kullanımına devam eder.
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);
}

Tamamen nooby yolu ... C


3
Bu, bir dizideki maksimum değerin C ++ değil, nasıl bulunacağı sorusunu yanıtlıyorvector
Andrew Stubbs

Bu soru C ++ olarak etiketlenmiştir. Bu kodu C'de yazdınız, ancak sadece bu değil, bir vektörü bir diziye eşitliyorsunuz - doğru değil. Sadece gerçek değere ihtiyacımız olduğunda, gereksiz baskı ifadeleriniz de olur. Son olarak, kodun tamamı dikkat dağıtıcıdır. Sadece fordöngüdeki koda ihtiyacınız var . Genel olarak, çok zayıf bir yanıt.
rayryeng
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.