首页 > 解决方案 > 为什么 sizeof(ar)/ sizeof(ar[0]) 在传递给函数时不能在向量上正常工作?

问题描述

我试图更好地了解 c++ 并遇到了这种困惑。

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

当我传递一个包含 10 个元素的向量时,结果低于预期。我检查了 n=6,这与我使用 size() 时给出的 n=10 不同。我的困惑是因为代码的编写方式通常在 main 中使用 sizeof(ar)/sizeof(ar[0])。

标签: c++c++11

解决方案


使用“sizeof 技巧”从未std::vector.

对象的大小std::vectorstd::vector对象本身的大小,而不是向量处理的可能数据。

如果要从std::vector对象中获取元素的数量,请使用size成员函数。


“sizeof 技巧”仅适用于实际数组,例如

int array[10];
std::cout << sizeof(array) / sizeof(array[0]) << '\n';  // Will print 10

至于你试图用你的函数解决的问题,有更好的方法来处理它。

  • 首先,您可以使用大小进行迭代(就像现在一样)

    for (size_t i = 0; i < ar.size(); ++i)
        sum += ar[i];
    
  • 然后你可以使用迭代器进行迭代

    for (auto i = ar.begin(); i != ar.end(); ++i)
        sum += *i;
    
  • 然后你有基于范围的for循环

    for (auto value : ar)
        sum += value;
    
  • 最后,您可以使用标准算法功能,例如std::accumulate

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

推荐阅读