通过unique_ptr访问std :: array

Gar*_*Gar 0 c++ c++14

这只是为了学习目的,我知道我可以使用矢量,但我有

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
Run Code Online (Sandbox Code Playgroud)

我知道.get()返回一个指向托管对象的指针,但我不明白为什么我需要做my_arr.get()[0][0]两次?

Nat*_*ica 6

my_arr.get()给你一个std::array<int, N>*.因为你有一个指针做的pointer[0]是相同的*pointer.所以你实际上并不需要my_arr.get()[0][0],你可以改用

(*my_arr.get())[0]
Run Code Online (Sandbox Code Playgroud)

表明您正在取消引用指针.事实上,你可以使用

(*my_arr)[0]
Run Code Online (Sandbox Code Playgroud)

因为它operator *被重载了std::unique_ptr,它将返回对指向的东西的引用.


Pet*_*man 5

好吧,您不必这样做,但它确实有效。

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()
Run Code Online (Sandbox Code Playgroud)