因此,我制作了一个将数组作为参数的函数,并且尝试通过将尚未定义为变量的数组传递到该函数中来调用该函数(例如{0,0,0,0})。但是,出现一个错误,提示“初始化器值太多”。
说我们有一个定义为的函数:
int func(int values[]) {
int average = 0;
for(int x = 0; x < values.size(); x++) {
average += values[x];
}
return average / values.size();
}
我们想在不定义要像这样传递的数组的情况下调用它:func({1,6,7,2});
有什么办法可以做这样的事情,还是我必须定义一个数组并将其以这种方式传递给函数?
答案 0 :(得分:8)
您不能使用内置数组来做到这一点。数组既不可分配也不可复制。另外,它们不是类,因此它们没有像size()
这样的成员函数,或者它们带有Initializer-list。
如果大小恒定,则可以使用std::array
来实现;如果大小是动态的,则可以使用std::vector
来实现。
#include <array>
int func(const std::array<int, 5>& values) {
int average = 0;
for (size_t x{}, sz{ values.size() }; x != sz ; ++x)
average += values[x];
return average / values.size();
}
int main() {
auto ret{
func({ 1, 6, 7, 2 })
};
std::cout << ret << std::endl;
}
也不要像在循环中那样将“未签名”与“已签名”混合使用:
for(int x = 0; x < values.size(); x++) // x is int while values.size() is unsigned int.
int func(const std::array<int, 5>& values)
:通过引用避免复制,特别是在尺寸较大的情况下。只要函数不打算更改参数,也可以通过const传递,使用const引用的另一个好处是可以传递文字而不是对象。
注意:我建议也使用range-based for
,因为它在您的示例中确实相关,只要您想遍历所有元素并且不打算insert
或{ {1}}个元素:
delete
@ M.M指出的int average = 0;
for (const auto& e : values)
average += e;
的另一个版本是使用func
为您完成这项工作:
std::accumalate
答案 1 :(得分:2)
使用矢量,是的
#include <vector>
using namespace std;
void f( const vector <int> & v ) {
}
int main() {
f( {1,2,3,4} );
}
答案 2 :(得分:1)
数组不能那样工作。当您将数组传递给函数时,第一个元素的地址就像指针一样传递,并且在函数内部没有关于数组大小的更多信息。 (在编译器本身可以推断出大小之前,因为数组是在作用域中声明的,但是可以在任意位置调用函数)
如果要执行类似的操作,则要么必须使用容器类(例如向量),要么可以将第二个参数传递给函数,以说明数组的大小。另一种方法是在数组中具有某种终点,例如c字符串的情况,例如空值。