假设我将参数传递给这样的函数:
void myFunc( int* arrayOfInts );
从函数不知道整数数组的大小的意义上说,这似乎并不安全。我可以发表评论说“这个函数假设它得到一个 10 个整数的数组”,但无法检查它。所以这个函数的错误使用会导致神秘的“分段错误”。有一个更好的方法吗?
假设我将参数传递给这样的函数:
void myFunc( int* arrayOfInts );
从函数不知道整数数组的大小的意义上说,这似乎并不安全。我可以发表评论说“这个函数假设它得到一个 10 个整数的数组”,但无法检查它。所以这个函数的错误使用会导致神秘的“分段错误”。有一个更好的方法吗?
也传递数组的大小,C 风格:
void myFunc(int* arrayOfInts, int arraySize);
或者传入一个指向数组末尾之后的指针,迭代器样式:
void myFunc(int* begin, int* end);
或者传入一个std::vector<int>
或等效项并完全回避问题:
void myFunc(const std::vector<int>& vec);
在 C 和 C++ 中,在处理原始数组时,函数通常还需要传入数组的大小,例如
void foo(int *arr, size_t size_);
但是在 C++ 中,你为什么不使用std::vector
呢?它是安全的。
使用模板函数
template <int N>
void fmyFunc(int (& array)[N])
{
}
或 STL 容器(在现代 C++ 代码中是更好的方法)
void fmyFunc(const std::vector<int>& v)
{
}
旧方法是传入数组大小
void fmyFunc(int* arrayOfInts, int size)
{
}
您可以通过引用数组来获取参数,并将数组的大小设为模板参数N
:
template <int N>
void myFunc(int (&arrayOfInts)[N])
{
// here we know the size is N
}
或者,如果您的函数应该只接受特定大小的数组(例如,一个大小为 3 的数组的 3D 点),请指定该大小而不是使用模板。这样编译器只会让你用一个有效的数组调用这个函数:
void myFunc(int (&arrayOfExactlyThreeInts)[3])
{
}
直截了当的 C++ 答案是使用std::vector
.
传统的 C/C++ 答案是也接受数组大小作为参数。
还有第三个特定于 C++ 的答案:您可以使用专门针对数组大小的函数模板。这并不意味着你应该。有关详细信息,请参阅c++ function template specialization for known size typedefed array中接受的答案。
考虑使用指示大小的第二个参数,或者更好地使用std::vector<int>
允许您在函数内部查询大小的参数
要么传递大小,要么最好使用std::vector<int>
.
正如其他人所说,添加一个带有数组大小的参数。这样做的原因是您可以为不同大小的数组编写一个函数。编写计算数组大小的模板函数的方法意味着对于传递给模板的每个数组大小,您都有不同的函数。而且,是的,avector
有自己的大小,但会增加开销才能做到这一点。有时最简单的就是最好的。