如何可靠地获得C样式数组的大小?通常推荐的方法似乎是使用sizeof,但它在传入x的foo函数中不起作用:
#include <iostream>
void foo(int x[]) {
std::cerr << (sizeof(x) / sizeof(int)); // 2
}
int main(){
int x[] = {1,2,3,4,5};
std::cerr << (sizeof(x) / sizeof(int)); // 5
foo(x);
return 0;
}this question的回答推荐sizeof,但他们并没有这么说(显然是这样?)如果您传递数组,则不起作用。那么,我是不是必须使用一个前哨呢?(我不认为我的foo函数的用户总是可以相信他们会在末尾放置一个标记。当然,我可以使用std::vector,但这样我就得不到很好的简写语法{1,2,3,4,5}了。)
发布于 2010-03-09 04:44:49
在C数组中,C中的参数实际上只是指针,因此sizeof()无法工作。您要么需要将size作为另一个参数传递,要么使用一个前哨--以最适合您的设计为准。
其他一些选项:
其他一些信息:
对于
array_proxy模板,效果很好。在使用参数的函数内部,您可以获得类似std::vector的操作,但是函数的调用者可以使用一个简单的C数组。不需要复制数组-sizeof模板负责将数组指针和数组大小打包在C中用于确定数组中元素数量的automatically.发布于 2010-03-09 04:59:59
GNU Libstdc++文档中提到的一个函数是lengthof函数:
template<typename T, unsigned int sz>
inline unsigned int lengthof(T (&)[sz]) { return sz; }您可以将其用作
int x[] = {1,2,3,4,5};
std::cerr << lengthof(x) << std::endl;警告:仅当阵列没有decayed into a pointer时,这才起作用。
发布于 2010-03-09 04:46:19
您可以传递大小,使用前哨,甚至更好地使用std::vector。尽管std::vector没有初始化器列表,但仍然可以很容易地用一组元素构造一个向量(尽管不是很好)
static const int arr[] = {1,2,3,4,5};
vector<int> vec (arr, arr + sizeof(arr) / sizeof(arr[0]) );vector类也使得犯错误变得更加困难,这是有价值的。另一个好处是所有的C++都应该熟悉它,并且大多数C++应用程序都应该使用std::vector而不是原始的C数组。
作为快速说明,C++0x添加了Initializer lists
std::vector<int> v = {1, 2, 3, 4};您也可以使用Boost.Assign来做同样的事情,尽管语法有点复杂。
std::vector<int> v = boost::assign::list_of(1)(2)(3)(4);或
std::vector<int> v;
v += 1, 2, 3, 4;https://stackoverflow.com/questions/2404567
复制相似问题