将C++数组强制转换为矢量

cast an C++ array to a vector

本文关键字:转换 C++ 数组      更新时间:2023-10-16

这是我在Leetcode上找到的代码。但是我无法理解以下两行,尤其是*(&a + 1).结果显示了数组a的副本。谁能对此做出一些解释?谢谢!

int a[5] = {0, 1, 2, 3, 4};
vector<int> v4(a, *(&a + 1));

从数组构造向量时通常遇到的示例通常如下所示:

int a[5] = {...};
vector<int> v4(a, a + 5 );
// or vector<int>(a, a+sizeof(a)/int); // automatically calculate num elems inside a

上面的例子只是表明你想使用数组"a"内的所有元素构造一个向量。此示例中的"a"只是数组起始元素的地址,然后添加 5 以获取最后一个元素的地址。更直观的编写方法是:

vector<int> v4(begin(a), end(a));

当然,除非你不想要 v4 中的所有元素

现在,您给我们的示例是第一个示例的简写,您不需要显式声明数组的大小。 我假设您只是对向量构造函数的第二个参数感到困惑。 第二个参数只返回数组"a"的最后一个元素的地址。但是怎么做呢?

好吧,让我们分解一下: &a 将地址返回给"a[]"。本质上是指向数组"a"的指针。现在,如果您向此地址添加一个,您将获得一个指向地址"a[0]"+ sizeof a[]的指针,该指针将指向地址a的最后一个元素。将此与上面的第一个示例进行比较。你必须加上5,为什么这里不是这种情况?好吧,您正在使用不同的单位。&a 指向 a[] 的起始地址,而不是数组第一个元素的地址。因此,您实际上是以 a[5] 为单位而不是以 int 为单位移动地址。

最后,您有取消引用运算符"*"来取消引用指针并获取最后一个元素的array[]地址。

A 是类型 A[],&A 是类型 *a[],因此需要取消引用才能使其具有相同的类型,否则会出现编译器错误。

TLDR:您使用不同的方法获取最后一个元素的地址。+1 运算符的行为相对于您正在处理的类型。a + 1 与起始地址 ">a" +sizeof 1 整数相同。&a + 1 与 a[] 的起始地址+ a[] 的大小相同。

你对数组衰减感到困惑。a是数组"作为一个整体"。 它衰减成指向大多数上下文中第一个元素的指针,但 unary-&的操作数是少数几个没有的操作数之一。 因此,&a为您提供整个数组的地址,而不是第一个元素的地址。 这些是同一个地方,但有不同的类型(int (*)[5]vsint *(,不同的类型意味着指针算术是不同的。