有没有办法找出一个数组有多少个值?检测是否已经到达数组的末尾也可以工作。
当前回答
使用泛型的一个好的解决方案:
template <typename T,unsigned S>
inline unsigned arraysize(const T (&v)[S]) { return S; }
然后简单地调用arraysize(_Array);来获取数组的长度。
源
其他回答
假设在页面顶部声明了一个全局数组
int global[] = { 1, 2, 3, 4 };
要找出数组中有多少个元素(在c++中),输入以下代码:
sizeof(global) / 4;
sizeof(NAME_OF_ARRAY) / 4将返回给定数组名的元素数量。
只是一个想法,但只是决定创建一个计数器变量,并将数组大小存储在位置[0]。我删除了函数中的大部分代码,但你会看到退出循环后,prime[0]被分配为'a'的最终值。我尝试使用矢量,但VS Express 2013不太喜欢。还要注意,'a'从1开始,以避免覆盖[0],并在开始时初始化以避免错误。我不是专家,只是想分享一下。
int prime[] = {0};
int primes(int x, int y){
using namespace std; int a = 1;
for (int i = x; i <= y; i++){prime[a] = i; a++; }
prime[0] = a; return 0;
}
正如其他人所说,您可以使用sizeof(arr)/sizeof(*arr),但这将为非数组的指针类型提供错误的答案。
template<class T, size_t N>
constexpr size_t size(T (&)[N]) { return N; }
这具有对非数组类型编译失败的良好属性(Visual Studio有_countof可以做到这一点)。constexpr使它成为编译时表达式,因此它没有任何宏的缺点(至少我不知道)。
你也可以考虑使用c++ 11中的std::array,它公开了它的长度,而不增加C原生数组的开销。
c++ 17在<iterator>头文件中有std::size(),它具有相同的功能,也适用于STL容器(感谢@Jon C)。
我个人建议(如果你因为任何原因无法使用专门的函数)首先扩展数组类型的兼容性,超出你通常使用它的范围(如果你存储的值≥0:
unsigned int x[] -> int x[]
你会让数组的元素比你需要的要大。对于最后一个元素,你可以放置一些类型,包括在扩展类型说明符中,但你通常不会使用,例如,使用前面的例子,最后一个元素将是-1。这使您能够(通过使用for循环)找到数组的最后一个元素。
避免将类型与sizeof一起使用,因为如果改变数组类型,sizeof(array)/sizeof(char)会突然被破坏。
在visual studio中,你有等效的if sizeof(array)/sizeof(*array)。 你可以输入_countof(array)