我的代码关于通过向量找到最大一和最小一的代码怎么了

时间:2019-02-08 11:15:24

标签: c++ vector

我写了一个代码,它将通过矢量在一个arr中找到最大值1和最小值1 但我根本不知道自己犯了什么错误。

每次我尝试为我返回零时,大声笑

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
    int a[999];
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i]; 
    }
    vector<int> arr(a[1], a[n]);
    int max = *max_element(arr.begin(), arr.end());
    int min = *min_element(arr.begin(), arr.end());
    int dis = max - min; cout << dis << endl;
    return 0;
} 

1 个答案:

答案 0 :(得分:2)

  

我的代码[?]怎么了

老实说,几乎所有东西。

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

using namespace std; can cause harm,而不是像这样的小例子,但最好不要习惯坏习惯。

int main()
{
    int a[999];

您为999个元素分配空间。如果用户输入1000的{​​{1}}怎么办?

n

数组索引从 int n; cin >> n; 开始,而不是0。假设用户输入了1,那么您仍然超出了调用undefined behaviour的范围,因为999不是数组的元素。

a[999]

您正在调用std::vector constructor,该向量的大小可以容纳值 for (int i = 1; i <= n; i++) { cin >> a[i]; } 的{​​{1}}个元素。这不是将元素从数组复制到向量!所有元素将具有相同的值,因此您总是得到a[1]作为结果。

a[n]

这并不是真正的错误,但是写起来不必要地复杂。 max_element返回一个迭代器,您可以使用例如。 std::distance获取两个迭代器之间的距离。

0

您可以这样写

    vector<int> arr(a[1], a[n]);
    int max = *max_element(arr.begin(), arr.end());
    int min = *min_element(arr.begin(), arr.end());

Live Demo

PS:请小心 int dis = max - min; cout << dis << endl; return 0; } 。在C ++ 11之前,使用第二个参数调用它是未定义的行为,而第二个参数无法通过向前传递的第一个迭代器来访问。另外请注意,有std::minmax_element可以让您两个迭代器都不必遍历向量一次。