通过unique_ptr访问std :: array

时间:2018-10-11 17:34:06

标签: 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

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

4 个答案:

答案 0 :(得分:6)

my_arr.get()给您std::array<int, N>*。由于您有一个指针,因此pointer[0]*pointer相同。因此,您实际上并不需要my_arr.get()[0][0],而可以使用

(*my_arr.get())[0]

表示您正在取消引用指针。实际上,您可以使用

(*my_arr)[0]

因为operator *的{​​{1}}重载,它将返回指向所指向对象的引用。

答案 1 :(得分:4)

好吧,您不必这样做,但是可以。

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()

答案 2 :(得分:4)

您可能不想这样做:

auto my_arr = std::make_unique<std::array<int, N>>();

除非您真的array<int, N>。如果您只是想动态分配N int s并使用unique_ptr进行管理,那就是:

auto my_arr = std::make_unique<int[]>(N);

这里的优点是:

  • N可以是运行时值,而不必是常量表达式。
  • unique_ptr<T[]>::operator[]存在并且可以执行您想要的操作,因此my_arr[2]可以索引到数组中。

答案 3 :(得分:3)

正如您自己所说,.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]