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


123

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

我已经在Google上看到了一些解决方案,但是对我来说,这些解决方案都没有道理:(

有人可以用一种简单明了的方法解释如何从向量中获取最大值或最小值吗?我是否认为与数组大致相同会错吗?

我需要一个迭代器吧?我尝试过,max_element但一直出现错误?

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

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

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

哇,谢谢您的快速回复!我以这种方式结束了,觉得还好吗?

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

cdf向量在哪里。


看起来cloud不是STL容器,而是int[10]。基本上cloud没有成员.begin()。除非您只做一件事,否则可能想获得一本基本的C ++书籍。
克里斯·A

其他一些代码也可能有用。云的定义在哪里?
蒂姆(Tim)

9
@bobblob:但是您发布的编译器错误指出“云属于非类类型int[10]”。那怎么可能是向量呢?
2012年

Answers:


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(...),请使用:/


嗨,您知道是否可以将其应用于维数组或向量?
周星驰

3
是的你可以。标准库算法已被设计为通常在迭代器上工作。指针也是迭代器。
sehe 2014年

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_elementmax_element返回一个迭代器,而不是指针。但是,从技术上讲,指针是迭代器的子集。请参阅:stackoverflow.com/questions/2728190/...
rayryeng

我已经更新了答案。感谢您的观察。
Taohidul Islam

9

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


也要尝试这个。我尝试过获得max_element但没有爱。谢谢!
bob blob 2012年


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 '17

1

如果要使用迭代器,则可以对数组进行新放置

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

请注意,()结尾处缺少a ,这一点很重要。这将创建一个使用该内存作为存储空间的数组类,并具有STL功能(如迭代器)。

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


1

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

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 '18

1
因为从错误消息中很明显,他没有向量而是正常数组。而且您必须以某种方式计算其长度,以避免使用硬编码的幻数。他将来可能会更改长度,但是用于以这种方式查找最大值的代码将相同。
ivan.ukr

抱歉,未正确显示。您的解决方案是正确的,但是很糟糕。原因是它假定使用了幻数,而错误消息中没有出现幻数。然后继续使用宏,这些宏始终是代码的味道。
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);
}

完整的nooby方式...在C语言中


3
这回答了如何在数组而不是C ++中找到最大值的问题vector
Andrew Stubbs 2014年

这个问题被标记为C ++。您已经用C语言编写了此代码,但不仅如此,还使向量等于数组-不正确。当我们只需要实际值时,您也有不必要的打印语句。最后,整个代码令人分心。您只需要for循环中的代码。总体而言,答案很差。
rayryeng '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.