[英]Accessing a std::array via a unique_ptr
这只是出于学习目的,我知道我可以只使用向量,但是我有
const int N = 1e3;
auto my_arr = std::make_unique<std::array<int, N>>();
// To access it I have to do this - why [0][0] twice?
my_arr.get()[0][0] = 1;
// Getting the size for fun
std::cout << sizeof(my_arr.get()) << "\n"; // outputs 8
std::cout << sizeof(my_arr.get()[0]) << "\n"; // outputs 800000000
std::cout << sizeof(my_arr.get()[0][0]) << "\n"; // outputs 8
我知道.get()返回指向托管对象的指针,但是我不明白为什么我需要两次进行my_arr.get()[0][0]
吗?
my_arr.get()
给您一个std::array<int, N>*
。 由于您有一个指针,所以pointer[0]
与*pointer
相同。 因此,您实际上不需要my_arr.get()[0][0]
而可以使用
(*my_arr.get())[0]
表明您正在取消引用指针。 实际上,您可以使用
(*my_arr)[0]
因为operator *
对于std::unique_ptr
重载,并且它将返回指向所指事物的引用。
好吧,您不必这样做,但是可以。
my_arr.get()
返回一个std::array<int,N>*
像任何指针一样,您可以像数组一样对其进行索引。
my_arr.get()[0]
返回对数组“数组”中第一个元素的引用。
然后,您可以使用std::array
的索引运算符来获取元素。
my_arr.get()[0][0]
返回对所需元素的引用。
或者,您可以编写:
my_arr->at(0)
my_arr->operator[](0)
(*my_arr)[0]
*my_arr->data()
您可能不想这样做:
auto my_arr = std::make_unique<std::array<int, N>>();
除非您真的特别想要array<int, N>
。 如果您只是想动态分配N
int
并使用unique_ptr
管理,那就是:
auto my_arr = std::make_unique<int[]>(N);
这里的优点是:
N
可以是一个运行时值,而不必是一个常量表达式。 unique_ptr<T[]>::operator[]
存在并且可以执行所需的unique_ptr<T[]>::operator[]
,因此my_arr[2]
可以对数组进行索引。 就像您自己说的那样, .get()
返回一个指向托管对象的指针。
所以它返回的是std::array<int, N>*
而不是std::array<int, N>
:
std::array<int, N>* array_ptr = my_arr.get();
因此,请写入(*my_arr)[0]
或(*my_arr.get())[0]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.