如何找到向量中的最大元素(C++)?

Posted

技术标签:

【中文标题】如何找到向量中的最大元素(C++)?【英文标题】:How do I find the max element in a vector (C++)? 【发布时间】:2015-08-22 17:58:18 【问题描述】:

这是我的代码。我省略了向量的代码,因为它并不重要。

#include <string>
#include <iostream>
#include <vector>
using namespace std;


int main() 
    vector<int> scores;

    // code to make vector

    cout << "High score: " << scores[std::max(scores.begin(), scores.end())] << endl;
    system("pause");

我的理解是 std::max 返回一个迭代器,但我真的不知道如何处理迭代器。我看过这个例子

*max(scores.begin(), scores.end())

让它返回一个索引而不是一个迭代器,但它得到了错误

Expression: vector iterator not dereferencable

我尝试使用迭代器,然后使用 std::distance

vector<int>::iterator high = std::max(scores.begin(), scores.end());
cout << "High score: " << scores[std::distance(scores.begin(), high)] << endl;

但我得到了错误

Expression: vector subscript is out of range. 

解决这个问题的最佳方法是什么?

【问题讨论】:

你使用了一个名为std::max_element的函数。 std::max 并不像您认为的那样做,正如您通过阅读精美的手册很容易发现的那样。 【参考方案1】:

在标题&lt;algorithm&gt; 中声明了一个名为std::max_element 的标准算法,可以满足您的需要。

例如

#include <algorithm>

//...

cout << "High score: " << *std::max_element( scores.begin(), scores.end() ) << endl;

假设向量不为空。

至于这个电话

std::max(scores.begin(), scores.end())

然后它返回这两个迭代器中的最大迭代器。并且end()对应的迭代器总是大于或等于(如果向量为空)begin()对应的迭代器。

【讨论】:

我试过了,但我的编译器说“std has no member 'max_element'” @potapeno 您必须包含标题 因为它已经写在我的帖子中。 没关系,我没有包括算法...这更有意义 @potapeno 现在您知道了 C++ 中的另一种标准算法。:)【参考方案2】:

最好的方法是使用 max_element:

vector<int> scores;
//input
vector<int>::iterator it;
it=max_element(scores.begin(),scores.end());
cout<<*it;

如果您想要最大值而不用担心时间复杂度 你也可以使用这个(虽然不建议):

sort(scores.begin(),scores.end());
cout<<scores[scores.size()-1];

您必须只使用第一种方式!

【讨论】:

以上是关于如何找到向量中的最大元素(C++)?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用用户定义的谓词查找向量的最大元素

在 C++ 矩阵中查找最大元素的索引?

如何根据 R 中的用户定义层次结构找到向量的最大字符?

如何找到多维数组的模式?

需要帮助编写一个函数来查找 N 维数组 C++ 中的最大值和最小值

根据最大值索引 C++ 从 2 个向量中提取值