有没有办法找出一个数组有多少个值?检测是否已经到达数组的末尾也可以工作。
当前回答
我认为这是可行的:
for(int i=0;array[i];i++)
{
//do_something
}
其他回答
我个人建议(如果你因为任何原因无法使用专门的函数)首先扩展数组类型的兼容性,超出你通常使用它的范围(如果你存储的值≥0:
unsigned int x[] -> int x[]
你会让数组的元素比你需要的要大。对于最后一个元素,你可以放置一些类型,包括在扩展类型说明符中,但你通常不会使用,例如,使用前面的例子,最后一个元素将是-1。这使您能够(通过使用for循环)找到数组的最后一个元素。
如果你指的是c风格的数组,那么你可以这样做:
int a[7];
std::cout << "Length of array = " << (sizeof(a)/sizeof(*a)) << std::endl;
这对指针不起作用(即它对以下任何一个都不起作用):
int *p = new int[7];
std::cout << "Length of array = " << (sizeof(p)/sizeof(*p)) << std::endl;
or:
void func(int *p)
{
std::cout << "Length of array = " << (sizeof(p)/sizeof(*p)) << std::endl;
}
int a[7];
func(a);
在c++中,如果你想要这种行为,那么你应该使用容器类;可能std::向量。
我在这里提供了一个棘手的解决方案:
你总是可以在第一个元素中存储长度:
// malloc/new
arr[0] = length;
arr++;
// do anything.
int len = *(arr-1);
free(--arr);
代价是在调用free时必须—arr
你有很多选项可以用来获取C数组的大小。
int myArray[] = {0, 1, 2, 3, 4, 5, 7};
1) sizeof(<array>) / sizeof(<type>):
std::cout << "Size:" << sizeof(myArray) / sizeof(int) << std::endl;
2) sizeof(<array>) / sizeof(*<array>):
std::cout << "Size:" << sizeof(myArray) / sizeof(*myArray) << std::endl;
3) sizeof(<数组>)/ sizeof(<数组>[<元素>]):
std::cout << "Size:" << sizeof(myArray) / sizeof(myArray[0]) << std::endl;
最常见的原因之一是,您希望将数组传递给函数,而不必为其大小传递另一个参数。您通常也希望数组大小是动态的。该数组可能包含对象,而不是原语,而且对象可能很复杂,因此size_of()是计算计数的不安全选项。
正如其他人建议的那样,考虑使用std::vector或list等来代替原始数组。然而,在旧的编译器上,您仍然不能通过简单地这样做得到您可能想要的最终解决方案,因为填充容器需要大量丑陋的push_back()行。如果你像我一样,想要一个包含匿名对象的单行解决方案。
如果你使用STL容器替代原始数组,那么这篇SO文章可能会对你有用,让你知道如何初始化它: 用硬编码的元素初始化std::vector最简单的方法是什么?
下面是我使用的一个方法,它将在编译器和平台上普遍工作:
为对象集合创建一个结构体或类作为容器。为<<定义运算符重载函数。
class MyObject;
struct MyObjectList
{
std::list<MyObject> objects;
MyObjectList& operator<<( const MyObject o )
{
objects.push_back( o );
return *this;
}
};
你可以创建以你的结构体作为参数的函数,例如:
someFunc( MyObjectList &objects );
然后,你可以调用这个函数,像这样:
someFunc( MyObjectList() << MyObject(1) << MyObject(2) << MyObject(3) );
这样,您就可以在一行代码中构建并将动态大小的对象集合传递给函数!