C++ 为什么数组没有长度属性
c++ why array doesn't have length attribute
假设我们有一个数组
int arr[3];
在 C++11 中我们可以做到
end(arr);
以获得 ARR 的边界。
和
sizeof(arr)/sizeof(arr[0])
可以获取数组的大小。
实际上我来自Java,并且刚接触C++,像arr.length
一样拥有sth.很直观,但是为什么C++没有这个不错的功能呢?使用外部函数来获取数组的大小非常奇怪。(而且结束功能甚至在C++11之后添加,在此之前事情就更麻烦了(我想它有sth。要与数组后面的实现有关,必须有一些边界标记,就像字符串末尾的"\0"一样。那为什么不更进一步呢?喜欢长度?
C++语言数组没有内置的大小方法,因为它们是从 C 继承而来的,并且通常只提供 C 赋予它们的行为。C++17 提供了一个非成员std::size
函数,可以计算数组(实际上是任何大小的容器(的大小。
使用外部函数来获取数组的大小非常奇怪。
并非 C++ 中的所有内容都是成员函数。最好现在就习惯。
我会补充另一个答案,虽然其他人是对的,但我认为他们错过了一个核心点。
int arr[3];
形式的数组是C++ C 根的余数,尽管它们完全有效,但它们缺乏很多,其中之一是知道自己大小的能力。不鼓励在C++中使用它们(但仍然是可能的,否则大量旧代码将停止工作!如果你编写新代码,你永远不应该考虑使用它们。没有优点,而且有很多缺点。
使用简单数组C++方法是标准库模板std::array<int,3> arr;
。这是一个安全的数组,它知道自己的大小,并且可以在访问时进行边界检查。你可以像旧式数组一样使用arr[i]
,它有一个.size()
方法(以及许多其他方法(。
该标准库中还有许多其他集合类型,例如vector<>
(在使用过程中可以增长和收缩(、地图、集合等。
已编辑:
我不了解Java,但与许多语言相比,C++已知具有非常接近硬件的能力。为此,您使用低级技术。
对于大多数程序员来说,没有必要使用低级技术。事实上,根本不推荐这样做。考虑一下:(char a[6]; int i( -> a[i] == i[a]。这还不够可怕吗?
我不能代表硬件。每个平台都是不同的。但是想象一下一张纸,然后在那里写下你的数组。然后再写一个。还有一个。现在一些对象,字符串,一些未识别的二进制数据。也许来自不同程序的一些数据。
很快你就不会看到数组的末端在哪里。 C 字符串是的。他们有\0。但是整数?不是\0 == 0吗?
幸运的是,我们有高级编程。许多编程语言只支持高级编程,以防止程序员出错。
因为要环绕低级内置数组,您应该使用具有成员数组和成员大小的类。要使其可重用,您应该使其成为模板。然后你添加了很多东西,比如下标和迭代器。这听起来像是很多工作,不是吗?但幸运的是,一些聪明的人已经做到了。它是C++11的一部分,它们被称为容器。并选择合适的容器?除非你有理由使用其他东西,否则你应该使用"向量"。
#include <vector>
std::vector<int> arr;
长话短说。不要使用内置数组。使用向量。
从 c++17 开始,我们鼓励您在数组上使用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;
}
现场示例
在早期C++被称为兼容C而C没有这个特性
另一个原因是C++数组不是一个真正的对象,它在 OOP 中的意思(对象具有属性和方法/函数等(
为什么数组没有长度属性?这是一个悠久的历史,C诞生于1970年代,当时所有计算机的内存都非常昂贵和小巧。甚至struct
关键字在C语言的早期发展中也没有加入。
此链接可能对您有所帮助。
https://www.bell-labs.com/usr/dmr/www/chist.html
- 为什么我的 DeviceInformation 对象没有 System.Devices.InterfaceClassGuid 属性?
- 为什么 C++20 中的 [[可能]] 属性在这里引发警告?
- 为什么当我尝试从基本 clase 打印属性时,它在 c++ 中总是 0 ?
- 为什么MSVC(Visual C++)需要单独的dllimport和dllexport属性,而gcc不需要
- C++ 为什么数组没有长度属性
- 为什么结构属性声明和初始化顺序的行为是这样的?
- 为什么找不到我的着色器属性?
- 为什么我的函数不改变对象的属性
- 为什么在 BGL 中的访客中无法更改边缘属性?
- 为什么我不能分配此QT属性
- 当应用于静态方法时,为什么constexpr属性不起作用
- 为什么Clang自动将属性添加到我的功能中
- 在 OpenGL 中,为什么除非我再次重新指定顶点属性,否则我的缓冲区对象不会绘制?
- 为什么'mutable' lambda 函数属性,而不是捕获类型?
- 为什么 boost::qi 规则的属性必须用括号声明?
- 为什么我不能更改结构的字符数组属性?
- 为什么__weak属性需要运行时支持
- 为什么对象属性的值在 c++ 中将其指针添加到映射后返回零
- 为什么要为一个属性指定不同的顶点格式
- Com-interop:为什么tlibimp.exe生成只读属性