繁体   English   中英

将C ++数组转换为向量

[英]cast an C++ array to a vector

这是我在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指向[]的起始地址,而不是数组的第一个元素的地址。 所以你基本上以[5]为单位而不是int单位移动地址。

然后最后你有取消引用运算符“*”取消引用指针并获取最后一个元素的array []的地址。

a是类型a []和&a是类型* a []因此需要取消引用以使其成为相同类型,否则会出现编译器错误。

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

您对阵列衰减感到困惑。 a是“作为一个整体”的数组。 它衰减成一个指向MOST上下文中第一个元素的指针,但是unary-&的操作数是它没有的少数操作数之一。 所以&a给出了整个数组的地址,而不是第一个元素的地址。 这些是相同的地方,但有不同的类型( int (*)[5] vs int * ),不同的类型意味着指针算法不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM