c++ - 为什么 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])。
解决方案
使用“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); }
推荐阅读
- wix - 组件之间的自定义操作
- reactjs - componentDidMount() 中的 setState() 是否被视为反模式
- database - Oracle数据库编解码
- list - 尝试在 Haskell 中构造自定义数据类型的列表
- python - 自动特征选择 - Sklearn.feature_selection
- php - 在 Sonata Admin 下拉菜单中设置默认值
- javascript - 是否有前端开放库动态插入单元格到表中?
- javascript - 在没有拼接或推送命令的情况下插入值
- amazon-web-services - Terraform 销毁以从 AWS API 获取错误响应?
- ballerina - Ballerina:如何将 Oracle 数据库与 Ballerina 连接起来?