【问题标题】:maximum value of a vector displays as 0向量的最大值显示为 0
【发布时间】:2021-04-02 07:36:33
【问题描述】:

我输入一个向量A = {0,10}。 然后我将2 添加到每个小于平均值的元素中,并从每个大于平均值的元素中减去2。在这个操作之后,新的向量是{2,8},但是当我尝试打印这个向量的最大值时,由于某种原因,我得到了0

int smallestRangeI(vector<int>& A, int K) {
        int sum = 0;
        int avg = accumulate(A.begin(), A.end(), sum);
        avg = avg / A.size();
        for(int i = 0; i<A.size();i++)
        {
            if(A[i]<avg) A[i]=A[i]+K;
            else A[i]=A[i]-K;
        }
        return *max(A.begin(), A.end());
    }
int main() {
    vector<int> A = {0,10};
    int K = 2;
    cout<<smallestRangeI(A,K);
    return 0;
}

【问题讨论】:

  • 您是否尝试过在调试器中逐语句逐句执行代码以查看发生了什么以及所有计算的结果是什么?提示:这有助于将语句放在不同的行上。
  • 我建议通过添加缺少的标题来完成问题。在这种情况下,这无关紧要,但为了让您的示例编译,我们必须更改的所有内容都是我们改变行为并意外引入另一个错误或意外修复您正在寻找的错误的机会。
  • 附带说明,您对sum 的使用是错误的。它应该看起来更像这样:int sum = accumulate(A.begin(), A.end(), 0); int avg = sum / A.size();
  • 实际上我在最后一秒对代码进行了一些更改,但无法跟踪合理的变量名称,哈哈。嗯,你说的完全正确哈哈

标签: c++ function vector


【解决方案1】:

std::max 返回两个元素中较大的一个。您将两个迭代器传递给它,其中较大的一个是A.end(),然后您取消引用它,这会调用未定义的行为。

您似乎正在寻找 std::max_element,这为您提供了一个迭代器,指向 A 中的最大值,然后您可以取消引用:

return *max_element(A.begin(), A.end());

请注意,如果A 可能为空,则不应取消引用此迭代器,因为这也会调用未定义的行为。此外,如果A 为空,则此操作avg / A.size() 会导致除以0。

这个函数在A为空的情况下做什么取决于你。

【讨论】:

  • 可能会为 end 迭代器添加检查。函数的所有其余部分都可以使用空向量(......并不是全部)
  • @largest_prime_is_463035818 很好,添加到答案中,谢谢。
  • @largest_prime_is_463035818 实际上,函数的其余部分在我看来还可以。循环中有一个混合符号比较,但这不应该破坏任何东西。
  • 我第一次错过了这个:avg = avg / A.size();
  • @largest_prime_is_463035818 糟糕,这很粗心。非常感谢,也补充了。
猜你喜欢
  • 2015-05-04
  • 2019-04-10
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
  • 2014-09-13
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
相关资源
最近更新 更多