ベクトルの最大(または最小)値を取得するにはどうすればよいですか?


123

C ++でベクターの最大(または最小)値を取得するにはどうすればよいですか?

私はこれについてGoogleでいくつかの解決策を見ましたが、それらのどれも私には意味がありませんでした:(

誰かがベクトルから最大値または最小値を取得する方法を簡単でわかりやすい方法で説明できますか?そして私はそれが配列と多かれ少なかれ同じであると仮定することで間違っていますか?

イテレータが必要ですか?私はそれを試しましたmax_elementが、エラーが出続けましたか?

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

エラー: 'クラウド'のメンバー '開始'の要求、これは非クラスタイプ 'int [10]'です

編集:私は自分自身に答えることができませんでした??? ここに入れます...

うわー、速い返事をありがとう!私はそれをこのようにしてしまいました、それは大丈夫だと思いますか?

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

どこcdfベクトルです。


cloudSTLコンテナではなく、のように見えint[10]ます。基本的に、cloudメンバーがいません.begin()。あなたがこれを一つしているのでなければ、基本的なC ++の本を手に入れたいかもしれません。
Chris A.

さらにいくつかのコードも役に立つかもしれません。cloudの定義はどこですか?
Tim

9
@bobblob:それでも、投稿したコンパイラエラーは「クラウドは非クラスタイプですint[10]」と言っていました。では、どうすればベクトルになるのでしょうか?
jalf

回答:


118

c ++ 11 / c ++ 0xコンパイルフラグを使用すると、次のことができます。

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

それ以外の場合は、独自に記述します。

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

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

ああ、一度に両方が必要な場合は使用しstd::minmax_element(...)てください:/


こんにちは、次元配列またはベクトルに適用できることを知っていますか?
Charles Chow

3
はい、できます。標準ライブラリアルゴリズムは、一般的にイテレータで機能するように設計されています。ポインタもイテレータです。
sehe

85

関数を使用したい場合はstd::max_element()、次のようにする必要があります。

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

これがお役に立てば幸いです。


10
なぜそこにある**max_element
Konrad

39
これは、「max_element」がイテレータを返すためです
Angie Quijano

入力がvector <double>であると想定しているか、デフォルトで* max_element()がdouble valを返すと思います。
Sameer Kape

14

みましょう、

 #include <vector>

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

ベクトルが昇順または降順で並べ替えられている場合、複雑度O(1)でベクトルを見つけることができます。

昇順のベクトルの場合、最初の要素は最小の要素であり、v [0](0ベースのインデックス付け)で取得でき、最後の要素は最大の要素であり、v [sizeOfVector-1]で取得できます。

ベクトルが降順で並べ替えられている場合、最後の要素は最小の要素です。v[sizeOfVector-1]で取得でき、最初の要素は最大の要素です。v[0]で取得できます。

ベクトルがソートされていない場合は、ベクトルを反復して最小/最大の要素を取得する必要があります。この場合、時間の複雑さはO(n)です。ここで、nはベクトルのサイズです。

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

イテレータを使用できます

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

入力セクションで計算できます(特定のベクトルから最小または最大の要素を見つける必要がある場合)

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

また、組み込み関数によって最小/最大の要素を取得できます

#include<algorithm>

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

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

この関数を使用して、任意の範囲の最小/最大の要素を取得できます。といった、

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()関数の前にアスタリスク(*)を使用しました。どちらもイテレータを返すからです。すべてのコードはc ++です。


2
min_elementポインタではなくイテレータmax_element返します。ただし、技術的に正確であるためには、ポインターはイテレーターのサブセットです。参照:stackoverflow.com/questions/2728190/...
rayryeng

回答を更新しました。ご覧いただきありがとうございます。
タオヒドゥルイスラム教、2017

9

クラウドを想定するとint cloud[10]、次のように実行できます。 int *p = max_element(cloud, cloud + 10);


これも試します 以前にmax_elementを取得しようとしましたが、愛はありませんでした。ありがとう!
bob blob 2012年

7

max_element / min_element関数を使用して直接印刷できます。例えば:

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

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

5

c ++ 11では、次のような関数を使用できます。

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を参照しているので、これは使用するよりも良いstd::max_elementです...?
rayryeng 2017年

1

イテレータを使用する場合は、配列を使用して新しい配置を行うことができます。

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

()最後にaがないことに注意してください。これは重要です。これにより、そのメモリをストレージとして使用する配列クラスが作成され、イテレータなどのSTL機能が追加されます。

(ちなみにこれはC ++ TR1 / C ++ 11です)


1

max_elementを使用して、ベクトルの最大値を取得できます。max_elementは、イテレータを範囲内の最大値に返すか、範囲が空の場合は最後に返します。イテレータはポインタに似ているため(または、ポインタはイテレータの形式であると言えます)、値を取得する前に*を使用できます。したがって、問題ごとに、ベクトルの最大要素を次のように取得できます。

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

それはあなたにあなたのベクトル「雲」の最大要素を与えます。それが役に立てば幸い。


0

これだけ:

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

マクロを使用する理由 その理由はありません!エラーint cloud[10];は、マジックナンバーの使用から始まります。
Ulrich Eckhardt 2018

1
エラーメッセージから、彼はベクトルではなく通常の配列を持っていることは明らかです。そして、ハードコードされたマジックナンバーの使用を避けるために、その長さを数える必要があります。彼は将来的に長さを変更する可能性がありますが、この方法で最大値を見つけるコードは同じです。
ivan.ukr 2018

申し訳ありませんが、正しく認識されませんでした。あなたの解決策は正しいですが、悪いです。その理由は、エラーメッセージに続くマジックナンバーの使用を想定しているためです。次に、常にコードのにおいであるマクロの使用を続けます。
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);
}

完全なヌービー方法... Cで


3
これは、C ++ではなく配列の最大値を見つける方法の質問に答えますvector
Andrew Stubbs

この質問にはC ++のタグが付けられています。このコードをCで記述しましたが、それだけでなく、ベクトルを配列に等しいと見なしています。実際の値だけが必要な場合にも、不要な印刷ステートメントがあります。最後に、コード全体が邪魔になります。forループ内のコードが必要です。全体として、非常に悪い答えです。
rayryeng 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.