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

bob*_*lob 103 c++ vector max min

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

我在谷歌上看到了一些解决方案,但对我来说都没有意义:(

有人可以用简单明了的方式解释如何从矢量中获取最大值或最小值吗?假设它与数组大致相同,我错了吗?

我需要一个迭代器吗?我尝试过max_element但却一直出错?

vector<int>::const_iterator it;
it = max_element(cloud.begin(), cloud.end());
Run Code Online (Sandbox Code Playgroud)

错误:在'云'中请求成员'begin',这是非类型'int [10]'

编辑:我无法回答我自己的??? 所以我会把它放在这里......

哇,谢谢快速回复!我最终以这种方式做到了,你觉得好吗?

for (unsigned int i = 0; i < cdf.size(); i++)
  if (cdf[i] < cdfMin)
    cdfMin = cdf[i];
Run Code Online (Sandbox Code Playgroud)

哪里cdf是矢量.

seh*_*ehe 103

使用c ++ 11/c ++ 0x编译标志,你可以

auto it = max_element(std::begin(cloud), std::end(cloud)); // c++11
Run Code Online (Sandbox Code Playgroud)

否则,写你自己的:

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; }
Run Code Online (Sandbox Code Playgroud)

请访问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';
}
Run Code Online (Sandbox Code Playgroud)

哦,如果您需要同时使用std::minmax_element(...),请使用:/

  • 是的你可以.标准库算法的设计通常用于迭代器.指针也是迭代器. (3认同)
  • @starriet只是它支持的不仅仅是具有“begin()”/“end()”成员函数的标准容器。这正是最初问题的主题,因为它使用了 C 风格的数组,它适用于“std::begin(arr)”,但不适用于“arr.begin()”。 (2认同)

Ang*_*ano 68

如果你想使用这个功能std::max_element(),你必须这样做:

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

我希望这可以提供帮助.

  • 那是因为'max_element是一个迭代器 (27认同)
  • 为什么`*max_element`中有**`*`**? (6认同)
  • 确保始终放置代码片段所需的#include 文件。另外:将向量称为“向量”可能不是一个好主意 - 它不是保留关键字,但很接近! (2认同)

Tao*_*lam 13

让,

 #include <vector>

 vector<int> v {1, 2, 3, -1, -2, -3};
Run Code Online (Sandbox Code Playgroud)

如果向量按升序或降序排序,那么您可以找到复杂度为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];
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以使用迭代器,

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以在输入部分计算它(当你必须从给定的向量中找到最小或最大的元素时)

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);
}
Run Code Online (Sandbox Code Playgroud)

您还可以通过内置函数获得最小/最大元素

#include<algorithm>

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

int largest_element  = *max_element(v.begin(),v.end());
Run Code Online (Sandbox Code Playgroud)

您可以使用此功能获取任何范围的最小/最大元素.如,

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)
Run Code Online (Sandbox Code Playgroud)

我在min_element()/ max_element()函数之前使用过星号(*).因为它们都返回迭代器.所有代码都是c ++.

  • `min_element` 和 `max_element` 返回一个 **iterator**,而不是一个指针。但是,从技术上讲,指针是迭代器的子集。请参阅:/sf/ask/190973331/ (2认同)

Ash*_*sha 9

假设云是int cloud[10]你可以这样做: int *p = max_element(cloud, cloud + 10);


Kis*_*vas 6

您可以使用max_element/min_element函数直接打印它.例如:

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

  cout<<*min_element(v.begin(),v.end());
Run Code Online (Sandbox Code Playgroud)


小智 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 由于您引用的是 C++11,这比使用 `std::max_element` 更好,因为......? (2认同)