C++ 通过唯一的ptr访问std::阵列

C++ 通过唯一的ptr访问std::阵列,c++,c++14,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.ge

这只是为了学习,我知道我可以用向量,但我有

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
const int N=1e3;
auto my_arr=std::make_unique();
//要访问它,我必须这样做-为什么要[0][0]两次?
my_arr.get()[0][0]=1;
//为了好玩而穿这个尺码

std::cout正如您自己所说的
。get()
返回指向托管对象的指针

所以返回的是
std::array*
而不是
std::array

std::array*array_ptr=my_arr.get();

因此,您可以编写
(*myu arr)[0]
(*myu arr.get())[0]
,正如您自己所说的
。get()
返回指向托管对象的指针

所以返回的是
std::array*
而不是
std::array

std::array*array_ptr=my_arr.get();
所以要么写
(*myu arr)[0]
要么写
(*myu arr.get())[0]
myu arr.get()
给你一个
std::array*
。由于您有一个指针执行
指针[0]
*指针
相同。因此,您实际上不需要
my_arr.get()[0][0]
,而可以使用

(*my_arr.get())[0]
以显示正在取消引用指针。事实上,你可以用

(*my_arr)[0]
因为
操作符*
std::unique\u ptr
重载,它将返回指向对象的引用。

my\u arr.get()
为您提供一个
std::array*
。由于您有一个指针执行
指针[0]
*指针
相同。因此,您实际上不需要
my_arr.get()[0][0]
,而可以使用

(*my_arr.get())[0]
以显示正在取消引用指针。事实上,你可以用

(*my_arr)[0]

因为
操作符*
对于
std::unique\u ptr
是重载的,它将返回指向对象的引用。

好吧,您不必这样做,但它是有效的

my_arr.get()
返回一个
std::array*

与任何指针一样,您可以像数组一样对其进行索引

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

好吧,你不必这么做,但它是有效的

my_arr.get()
返回一个
std::array*

与任何指针一样,您可以像数组一样对其进行索引

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>>();
这里的优点是:

  • N
    可以是运行时值,而不必是常量表达式
  • 存在并执行您想要的操作,因此
    my\u arr[2]
    会索引到数组中
      您可能不想这样做:

      auto my_arr = std::make_unique<std::array<int, N>>();
      
      这里的优点是:

      • N
        可以是运行时值,而不必是常量表达式
      • 存在并执行您想要的操作,因此
        my\u arr[2]
        会索引到数组中
      my\u arr.get()
      返回指针。取消对指针的引用和在位置0对其进行索引是同一回事
      ptr[0]
      定义为与
      *(ptr+0)相同
      我的arr.get()[0]
      *(我的arr.get())
      相同。你应该使用后者,因为没有
      my_arr.get()[1]
      。你真的确定
      const int N=1e3?看起来有点奇怪。还要记住,
      std::unique_ptr
      是指针的替代品,所以严格来说,你会得到一个指向从数组中衰减的指针的指针,并且你会得到或多或少的
      sizeof(int)
      @n.m。实际上op应该使用
      *my_arr
      ,而不使用get@πάνταῥεῖ 它有什么奇怪的地方?
      my_arr.get()
      返回一个指针。取消对指针的引用和在位置0对其进行索引是同一回事
      ptr[0]
      定义为与
      *(ptr+0)相同
      我的arr.get()[0]
      *(我的arr.get())
      相同。你应该使用后者,因为没有
      my_arr.get()[1]
      。你真的确定
      const int N=1e3?看起来有点奇怪。还要记住,
      std::unique_ptr
      是指针的替代品,所以严格来说,你会得到一个指向从数组中衰减的指针的指针,并且你会得到或多或少的
      sizeof(int)
      @n.m。实际上op应该使用
      *my_arr
      ,而不使用get@πάνταῥεῖ 有什么奇怪的地方吗?谢谢你提供了这些备选方案,他们非常有帮助。谢谢你提供了这些备选方案,他们非常有帮助