假设我们有一个数组
int arr[3];
在C ++ 11中,我们可以做到
end(arr);
获得arr的边界。
和
sizeof(arr)/sizeof(arr[0])
可以获得数组的大小。
实际上,我来自Java,并且是C ++的新手,很自然。像arr.length
,但是C ++为什么没有这个不错的功能?使用外部函数来获取数组的大小是很奇怪的(在C ++ 11之后甚至添加了end函数,在那之前事情变得更麻烦了)与数组后面的实现有关,必须有一些边界标记,就像字符串末尾的“ \ 0”一样。那为什么不进一步采取行动呢?像arr.length吗?
答案 0 :(得分:4)
C ++语言数组没有内置的size方法,因为它们是从C继承的,通常只提供C赋予它们的行为。 C ++ 17提供了一个非成员std::size
函数,该函数可以计算数组的大小(实际上是任何大小的容器)。
使用外部函数获取数组的大小很奇怪。
并非C ++中的所有内容都是成员函数。最好现在就习惯。
答案 1 :(得分:4)
我将添加另一个答案,尽管其他答案是正确的,但我认为他们错过了核心观点。
int arr[3];
形式的数组是C ++的C根的其余部分,尽管它们可以正常工作,但它们缺少很多东西,其中之一就是可以知道自己的大小。他们被完全剥夺了使用C ++的能力(但仍然可能,否则成千上万行的旧代码将停止工作!)。如果编写新代码,则永远不要考虑使用它们。没有优势,也有很多劣势。
使用C ++的简单数组的方法是标准库模板std::array<int,3> arr;
。这是一个安全的数组,它知道自己的大小,并且可以对访问进行边界检查。您可以像使用老式数组一样使用arr[i]
,它具有.size()
方法(以及许多其他方法)。
该标准库中还有许多其他集合类型,例如vector<>
(在使用过程中可能会增长和缩小),地图,集合等。
答案 2 :(得分:2)
已编辑:
我不了解Java,但是与许多语言相比,C ++能够与硬件非常接近。为此,您使用低级技术。
对于大多数程序员来说,没有必要使用低级技术。实际上,根本不建议这样做。考虑一下:(char a [6]; int i)-> a [i] == i [a]。这还不够可怕吗?
我不能代表硬件。每个平台都不同。但是,想象一下一张纸,然后将您的数组写在那里。然后再写一个。还有一个。现在,一些对象,字符串和一些未识别的二进制数据。也许来自其他程序的一些数据。
很快,您将看不到数组结尾的位置。 C字符串是的。他们有\ 0。但是整数?是\ 0 == 0吗?
幸运的是我们有高级编程。许多编程语言仅支持高级编程,以防止程序员出错。
由于要包装内置的底层数组,因此应使用具有成员数组和成员大小的类。要使其可重用,应将其作为模板。然后添加很多东西,例如下标和迭代器。听起来需要做很多工作,不是吗?但幸运的是,一些聪明的人已经做到了。它是C ++ 11的一部分,被称为容器。并选择合适的容器?除非您有理由使用其他内容,否则应使用“向量”。
commodity_id | timestamp | param1 | param2
c1 | '2018-01-01' | 5 | 15
c1 | '2018-01-03' | 7 | 15
c1 | '2018-01-08' | 8 | 10
c2 | '2018-01-01' | 100 | 13
c2 | '2018-01-02' | 140 | 13
c2 | '2018-01-05' | 130 | 13
c2 | '2018-01-06' | 150 | 13
长话短说。不要使用内置数组。使用向量。
答案 3 :(得分:1)
例如,给定您的int arr[3]
,您可以致电:size(arr)
获得3。
我说你很受鼓舞,因为size
可以在 上作为数组或带有size
方法的容器使用。允许您的模板代码独立于数组或容器的类型进行操作。
因此,在这种情况下,数组可以作为一个或两个参数传递,就像容器可以传递的一样:
template <typename FROM, typename TO>
bool foo(const FROM& lhs, TO& rhs) {
if(size(lhs) > size(rhs)) {
return false;
}
copy(cbegin(lhs), cend(lhs), begin(rhs));
return true;
}
答案 4 :(得分:-1)
在早期,C ++被称为与C兼容,而C不具有此功能
另一个原因是在C ++数组中不是一个真正的对象,这在OOP中是有意义的(对象具有属性,方法/功能等)
为什么数组没有长度属性?历史悠久,C诞生于1970年代,当时所有计算机的内存都非常昂贵且很小。在C语言的早期开发中,甚至没有加入struct
关键字。
此链接可能对您有所帮助。