【问题标题】:Get the sum of a vector获取向量的总和
【发布时间】:2019-10-05 13:39:26
【问题描述】:

如何返回这个整数向量数组的总和?我下面的代码返回了错误的值。

int simpleArraySum(vector<int> ar) {
    int sum = 0;
    int length = sizeof(ar);
    for (int i = 0; i < length; i++){
        sum += ar[i];
    }
    return sum;

}

【问题讨论】:

  • sizeof 运算符返回数据结构的大小。 std::vector 通常有一个指向数据的指针。使用std::vector::size() 方法,例如ar.length.

标签: c++ algorithm vector


【解决方案1】:

对于初学者来说,向量应该通过引用传递给函数。否则将创建向量的冗余副本。此外,参数应该用常量引用声明,因为向量本身在函数中没有改变。

对于总和,您应该使用 long long int 类型,因为不排除可能存在溢出。

此声明

int length = sizeof(ar);

没有意义。变量length 保持std::vector&lt;int&gt; 类型对象的大小,而不是向量中存储的元素数量。

所以函数可以定义例如下面的方式

long long int simpleArraySum( const std::vector<int> & ar )
{
    long long int sum = 0;

    for ( const auto &item : ar ) sum += item;

    return sum;
}

另一种方法是使用标头&lt;numeric&gt; 中声明的标准算法std::accumulate。例如

#include <vector>
#include <iterator>
#include <numeric>

//...

long long int simpleArraySum( const std::vector<int> & ar )
{
    return std::accumulate( std::begin( ar ), std::end( ar ), 0ll );
}

【讨论】:

  • 更好的是,按值使用 C++20 std::span
【解决方案2】:

使用std::accumulate:

int simpleArraySum(vector<int> ar) {
    return std::accumulate(ar.begin(), ar.end(), 0);
}

无论如何,你的length初始化是错误的,应该是:

int length = ar.size();

如果您仍然有意外的结果,则可能是您的 sum 不足/溢出(可能,使用更宽的类型)或者您有太多元素无法放入 int(不太可能,切换到 std::size_t 或使用 range-for 循环)。

【讨论】:

  • 这是我要解决的问题:hackerrank.com/challenges/simple-array-sum/problem。结果不是得到 31,而是得到 1203237048。有什么想法吗?我不敢相信数组中只有 6 个元素会导致任何溢出问题!!!
  • @Welshie321 查看弗拉德的回答!正如弗拉德解释的那样,您的 int length = sizeof(ar); 是错误的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多