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
はベクトルです。
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(...)
両方を同時に必要とする場合:/
関数std::max_element()
を使用する場合、その方法は次のとおりです。
double max = *max_element(vector.begin(), vector.end());
cout<<"Max value: "<<max<<endl;
これが役立つことを願っています。
させて
#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 ++です。
クラウドがint cloud[10]
であると仮定すると、次のようにできます:int *p = max_element(cloud, cloud + 10);
Max_element/min_element関数を使用して直接印刷できます。例えば:
cout<<*max_element(v.begin(),v.end());
cout<<*min_element(v.begin(),v.end());
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;
}
Max_elementを使用して、vectorの最大値を取得できます。 max_elementは、範囲内の最大値のイテレータを返します。範囲が空の場合は最後になります。イテレーターはポインターのようなものです(またはポインターはイテレーターの形式であると言えます)ので、値を取得する前に*を使用できます。したがって、問題ごとに、ベクトルの最大要素を次のように取得できます。
int max=*max_element(cloud.begin(), cloud.end());
ベクター「クラウド」の最大要素を提供します。それが役に立てば幸い。
イテレータを使用する場合は、配列でplacement-newを実行できます。
std::array<int, 10> icloud = new (cloud) std::array<int,10>;
最後に()
がないことに注意してください。これは重要です。これにより、そのメモリをストレージとして使用する配列クラスが作成され、反復子などのSTL機能が使用されます。
(ちなみにこれはC++ TR1/C++ 11です)
Vectorでmaxまたはminの値を見つける方法は非常に簡単です。
以下は簡単なコードです
sort(myVector.begin(),myVector.end());
int minimunValue = myVector[0];
int maximumValue = myVector[myVector.size()-1];
cout<<minimunValue<<" "<<maximumValue<<endl;