我们可以使用std :: array的常规指针算法吗?

Mik*_*Rev 0 c++ arrays c++-standard-library c++11

我想弄清楚如何在指向std :: array类的元素的指针上使用旧样式指针算法.以下代码(不出所料)可能无法编译:

int main(int argc, char *argv[])
{
    double* data1 = new double[(int)std::pow(2,20)];
    std::cout << *data1 << " " << *(data1 +1) << std::endl;
    delete data1;
    data1 = NULL;

    double* data2 = new std::array<double, (int)std::pow(2,20)>;
    std::cout << *data2 << " " << *(data2 +1) << std::endl;
    delete data2;
    data2 = NULL;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

作为练习,我想用所有的常规指针算法,但不是在一个老式双阵列指点,我希望它指向一个std ::数组的元素.我用这条线思考:

    double* data2 = new std::array<double, (int)std::pow(2,20)>;
Run Code Online (Sandbox Code Playgroud)

是指示编译器data2是指向分配的堆的第一个元素的指针std::array<double,(int)std::pow(2,20)>.

我被教导的double* name = new double[size];装置EXACTLY以下:«栈指针分配内存以一个双键并命名指针name,然后堆分配大小的double数组size,然后设置指针以指向该阵列的第一个元素. »由于上面的代码没有编译,我必须教一些不正确的东西,因为相同的语法对std :: arrays不起作用.

这提出了几个问题:

  1. 声明的实际含义是type* name = new othertype[size];什么?
  2. 如何使用std :: array实现我想要的?
  3. 最后,如何使用std :: unqiue_ptr和std :: make_unique实现相同的目标?

Bri*_*ian 7

我已经被教导double* name = new double[size];了以下方法:«Stack为指向ONE的指针分配内存并命名指针名称,然后堆分配一个大小为double的数组,然后将指针设置为指向第一个元素由于上面的代码没有编译,我必须被教导一些不正确的东西,因为相同的语法对std :: arrays不起作用.

你对这个陈述是正确的,但请记住,它的工作方式new[]是与其不同的运算符new.当您动态分配一个时std::array,您将调用单个对象new,并且返回的指针指向该std::array对象本身.

你可以对一个内容做指针运算std::array.例如,data2.data() + 1是一个指针data2[1].请注意,您必须调用.data()以获取指向底层数组的指针.

无论如何,不​​要动态分配std::array对象.尽可能避免动态分配,但如果需要,请使用std::vector.