繁体   English   中英

通过unique_ptr访问std :: array

[英]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);

这里的优点是:

就像您自己说的那样, .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.

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