如何获得向量中的最大值或最小值?

问题描述 投票:0回答:10

如何在 C++ 中获取向量的最大值或最小值?

我假设它与数组或多或少相同是错误的吗?

我需要一个迭代器,对吧?我用

max_element
尝试过,但一直出错。

vector<int>::const_iterator it;
it = max_element(cloud.begin(), cloud.end());
error: request for member ‘begin’ in ‘cloud’, which is of non-class type ‘int [10]’
c++ max min stdvector
10个回答
177
投票

使用 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(...)

 :/
    


176
投票
如果你想使用

std::max_element()

功能,你必须这样做:

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

27
投票
让,

#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++ 编写。


18
投票
您可以使用

max_elementmin_element 函数直接打印它。

例如:

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

12
投票
假设云是

int cloud[10]

,你可以这样做:
int *p = max_element(cloud, cloud + 10);

    


4
投票
在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; }
    

3
投票
您可以使用 max_element 来获取向量中的最大值。 max_element 返回一个迭代器,指向范围内的最大值,如果范围为空,则返回最后一个值。由于迭代器就像指针(或者你可以说指针是迭代器的一种形式),因此你可以在它之前使用 * 来获取值。 因此,根据问题,您可以获得向量中的最大元素:

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

它将为您提供矢量“云”中的最大元素。 希望有帮助。


2
投票
如果您想使用迭代器,您可以使用数组执行

placement-new

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

注意末尾缺少

()

,这很重要。这将创建一个使用该内存作为存储空间的数组类,并具有迭代器等 STL 功能。

(顺便说一句,这是 C++ TR1/C++11)


2
投票

代表作者回答

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

cdf

 是向量。


1
投票
就这样:

// 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));
    
© www.soinside.com 2019 - 2024. All rights reserved.