Làm cách nào để nhận giá trị tối đa (hoặc tối thiểu) trong một vectơ?


123

Làm cách nào để nhận giá trị tối đa (hoặc tối thiểu) trong một vectơ trong C ++ ?

Tôi đã thấy một vài giải pháp cho vấn đề này trên Google nhưng không có giải pháp nào phù hợp với tôi :(

Ai đó có thể giải thích một cách dễ hiểu đơn giản về cách lấy giá trị tối đa hoặc tối thiểu từ một vectơ được không? và tôi có sai khi giả định rằng nó sẽ giống hoặc ít hơn với một mảng không?

Tôi cần một trình lặp phải không? Tôi đã thử nó với max_elementnhưng vẫn nhận được lỗi?

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

error: yêu cầu thành viên 'begin' trong 'cloud', thuộc loại không thuộc lớp 'int [10]'

CHỈNH SỬA: Tôi đã không thể trả lời của riêng tôi ??? vì vậy tôi sẽ đặt nó ở đây ...

Wow, cảm ơn vì những câu trả lời nhanh chóng! Tôi đã làm theo cách này, bạn có nghĩ rằng nó ổn không?

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

nơi cdflà một vector.


Có vẻ như cloudkhông phải là một vùng chứa STL, mà là một int[10]. Về cơ bản, cloudkhông có một thành viên .begin(). Có thể muốn lấy một cuốn sách C ++ cơ bản trừ khi bạn chỉ làm một việc này.
Chris A.

Một số mã khác cũng có thể hữu ích. Định nghĩa của cloud ở đâu?
Tim

9
@bobblob: vậy mà lỗi trình biên dịch bạn đã đăng nói rằng "đám mây thuộc loại không phải lớp int[10]". Làm thế nào nó có thể là một vectơ sau đó?
jalf

Câu trả lời:


118

Sử dụng cờ biên dịch c ++ 11 / c ++ 0x, bạn có thể

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

Nếu không, hãy viết của riêng bạ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; }

Xem trực tiếp tại 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';
}

Ồ, và sử dụngstd::minmax_element(...) nếu bạn cần cả hai cùng một lúc: /


Xin chào, bạn có biết có thể áp dụng nó cho mảng thứ nguyên hoặc vectơ không?
Charles Chow

3
Có bạn có thể. Các thuật toán thư viện tiêu chuẩn đã được thiết kế để hoạt động chung trên các trình vòng lặp. Con trỏ cũng là trình vòng lặp.
sehe

85

Nếu bạn muốn sử dụng hàm std::max_element(), cách bạn phải làm là:

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

Tôi hy vọng điều này có thể giúp ích.


10
Tại sao có *trong *max_element?
Konrad

39
Đó là bởi vì'max_element'returns một iterator
Angie Quijano

Tôi đoán bạn đã giả định đầu vào là vector <double> hoặc * max_element () theo mặc định trả về giá trị kép.
Sameer Kape

14

Để cho,

 #include <vector>

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

Nếu vectơ được sắp xếp theo thứ tự tăng dần hoặc giảm dần thì bạn có thể tìm thấy nó với độ phức tạp O (1).

Đối với vectơ có thứ tự tăng dần, phần tử đầu tiên là phần tử nhỏ nhất, bạn có thể lấy nó bằng v [0] (lập chỉ mục dựa trên 0) và phần tử cuối cùng là phần tử lớn nhất, bạn có thể lấy nó bằng v [sizeOfVector-1].

Nếu vector được sắp xếp theo thứ tự giảm dần thì phần tử cuối cùng là phần tử nhỏ nhất, bạn có thể lấy nó bằng v [sizeOfVector-1] và phần tử đầu tiên là phần tử lớn nhất, bạn có thể lấy nó bằng v [0].

Nếu vectơ không được sắp xếp thì bạn phải lặp lại vectơ để lấy phần tử nhỏ nhất / lớn nhất, trong trường hợp này độ phức tạp thời gian là O (n), ở đây n là kích thước của vectơ.

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

Bạn có thể sử dụng trình lặp,

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

Bạn có thể tính toán nó trong phần đầu vào (khi bạn phải tìm phần tử nhỏ nhất hoặc lớn nhất từ ​​một vectơ đã cho)

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

Ngoài ra, bạn có thể lấy phần tử nhỏ nhất / lớn nhất bằng các hàm tích hợp

#include<algorithm>

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

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

Bạn có thể lấy phần tử nhỏ nhất / lớn nhất của bất kỳ phạm vi nào bằng cách sử dụng các hàm này. nhu la,

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)

Tôi đã sử dụng dấu hoa thị (*), trước các hàm min_element () / max_element (). Bởi vì cả hai đều trả về trình lặp. Tất cả các mã đều bằng c ++.


2
min_elementmax_elementtrả về một trình lặp , không phải một con trỏ. Tuy nhiên, về mặt kỹ thuật, con trỏ là một tập con của một trình vòng lặp. Xem: stackoverflow.com/questions/2728190/...
rayryeng

Tôi đã cập nhật câu trả lời của mình. Cảm ơn sự quan sát của bạn.
Taohidul Islam,

9

Giả sử đám mây là int cloud[10]bạn có thể làm như thế này: int *p = max_element(cloud, cloud + 10);


cũng sẽ thử điều này. Tôi đã cố gắng trước đó để có được max_element nhưng không có tình yêu. cảm ơn!
bob blob

7

Bạn có thể in trực tiếp bằng hàm max_element / min_element. Ví dụ:

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

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

5

Trong c ++ 11, bạn có thể sử dụng một số hàm như sau:

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

Vì bạn đang tham chiếu C ++ 11, điều này tốt hơn là sử dụng std::max_elementvì ...?
rayryeng

1

Nếu bạn muốn sử dụng một trình lặp, bạn có thể thực hiện một vị trí mới với một mảng.

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

Lưu ý rằng việc thiếu một ()ở cuối, điều đó là quan trọng. Điều này tạo ra một lớp mảng sử dụng bộ nhớ đó làm nơi lưu trữ và có các tính năng STL giống như trình vòng lặp.

(Nhân tiện đây là C ++ TR1 / C ++ 11)


1

Bạn có thể sử dụng max_element để nhận giá trị lớn nhất trong vectơ. Max_element trả về một trình lặp thành giá trị lớn nhất trong phạm vi hoặc giá trị cuối cùng nếu phạm vi trống. Vì một trình vòng lặp giống như con trỏ (hoặc bạn có thể nói con trỏ là một dạng của trình vòng lặp), bạn có thể sử dụng dấu * trước nó để nhận giá trị. Vì vậy, theo vấn đề, bạn có thể nhận được phần tử lớn nhất trong một vectơ là:

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

Nó sẽ cung cấp cho bạn phần tử tối đa trong "đám mây" vectơ của bạn. Hy vọng nó giúp.


0

Chỉ cái này:

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

Tại sao sử dụng macro? Không có lý do gì cho điều đó! Lỗi bắt đầu với int cloud[10];và đó là việc sử dụng các con số kỳ diệu.
Ulrich Eckhardt

1
Bởi vì từ thông báo lỗi rõ ràng là anh ta không có vector mà là mảng bình thường. Và bạn phải đếm độ dài của nó bằng cách nào đó, để tránh sử dụng các số ma thuật được mã hóa cứng. Anh ta có thể thay đổi độ dài trong tương lai, nhưng mã để tìm tối đa theo cách này sẽ giống nhau.
ivan.ukr

Xin lỗi, điều đó không xảy ra chính xác. Giải pháp của bạn là đúng, nhưng không tốt. Lý do là nó giả sử sử dụng các số ma thuật, không theo sau từ thông báo lỗi. Sau đó, nó tiếp tục với việc sử dụng các macro, vốn luôn luôn có mùi mã.
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);
}

The hoàn thành nooby way ... trong C


3
Đây trả lời câu hỏi làm thế nào để tìm giá trị tối đa trong một mảng, không phải là một C ++vector
Andrew Stubbs

Câu hỏi này được gắn thẻ C ++. Bạn đã viết mã này bằng C nhưng không chỉ vậy, bạn đang đánh đồng một vectơ với một mảng - không đúng. Bạn cũng có những câu lệnh in không cần thiết khi chúng tôi chỉ cần giá trị thực. Cuối cùng, toàn bộ mã gây mất tập trung. Bạn chỉ cần mã trong forvòng lặp. Nhìn chung, một câu trả lời rất kém.
rayryeng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.