将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 指向 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 *
(,不同的类型意味着指针算术是不同的。
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 是否可以从int转换为enum类类型
- 了解 GLM- openGL 中的相机转换
- 将无符号char*转换为std::istream*C++