为什么 sizeof(ar)/ sizeof(ar[0]) 在传递给函数时无法在向量上正常工作?

Why does sizeof(ar)/ sizeof(ar[0]) not work properly on a vector when passed to a function?

本文关键字:sizeof ar 向量 工作 常工作 函数 为什么      更新时间:2023-10-16

我试图更好地了解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 时不同。我的困惑来自于代码的编写方式在 sizeof(ar(/sizeof(ar[0]( 中正常工作。

使用"sizeof技巧"从未在std::vector起作用。

std::vector对象的大小是std::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);
    }
    

为什么 sizeof(ar(/sizeof(ar[0]( 在向量上无法正常工作...

sizeof(ar)/ sizeof(ar[0])是一个表达式,它为您提供数组的长度,并且仅提供数组的长度。std::vector不是数组。std::vector是一个类(模板(。sizeof(std::vector)与它拥有的元素数量(即长度(完全无关。

所有类型的大小都是编译时常量。std::vector可以包含可变数量的元素,这些元素不是编译时常量。因此,向量类型的大小不能取决于元素的数量。

。何时传递给函数?

当不传递到函数中时,它也不会起作用。