这只是出于学习目的,我知道我可以使用矢量,但是我有
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]
吗?
答案 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]