C ++为什么数组没有长度属性

时间:2018-06-23 13:45:13

标签: c++ arrays

假设我们有一个数组

int arr[3];

在C ++ 11中,我们可以做到

end(arr);

获得arr的边界。

sizeof(arr)/sizeof(arr[0])

可以获得数组的大小。

实际上,我来自Java,并且是C ++的新手,很自然。像arr.length,但是C ++为什么没有这个不错的功能?使用外部函数来获取数组的大小是很奇怪的(在C ++ 11之后甚至添加了end函数,在那之前事情变得更麻烦了)与数组后面的实现有关,必须有一些边界标记,就像字符串末尾的“ \ 0”一样。那为什么不进一步采取行动呢?像arr.length吗?

5 个答案:

答案 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)

开始,鼓励您在数组上使用size

例如,给定您的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;
}

Live Example

答案 4 :(得分:-1)

在早期,C ++被称为与C兼容,而C不具有此功能

另一个原因是在C ++数组中不是一个真正的对象,这在OOP中是有意义的(对象具有属性,方法/功能等)

为什么数组没有长度属性?历史悠久,C诞生于1970年代,当时所有计算机的内存都非常昂贵且很小。在C语言的早期开发中,甚至没有加入struct关键字。

此链接可能对您有所帮助。

https://www.bell-labs.com/usr/dmr/www/chist.html