Доступ к std :: array через unique_ptr - PullRequest
       12

Доступ к std :: array через unique_ptr

0 голосов
/ 11 октября 2018

Это просто для целей обучения, я знаю, что могу использовать вектор, но у меня есть

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] дважды?

Ответы [ 4 ]

0 голосов
/ 11 октября 2018

Вы, вероятно, не хотите этого делать:

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[] существует и выполняет то, что вы хотите, поэтому my_arr[2] выполняет индексированиев массив.
0 голосов
/ 11 октября 2018

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, и он вернет ссылку на указанную вещь.

0 голосов
/ 11 октября 2018

Ну, вам не нужно этого делать, но это работает.

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()
0 голосов
/ 11 октября 2018

Как вы сказали сами .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]

...