首页 > 解决方案 > 我们可以在 std::array 中使用传统的指针算法吗?

问题描述

我想弄清楚如何在指向 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;
}

作为练习,我想使用所有传统的指针算法,但不是指向旧式双精度数组,而是希望它指向 std::array 的元素。我对这一行的想法:

    double* data2 = new std::array<double, (int)std::pow(2,20)>;

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

我被告知这double* name = new double[size];意味着以下内容:«堆栈为指向 ONE double 的指针分配内存并命名指针name,然后堆分配大小为 double 的数组size,然后将指针设置为指向数组的第一个元素。 » 由于上面的代码无法编译,我一定是被教导了一些不正确的东西,因为相同的语法不适用于 std::arrays。

这提出了几个问题:

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

标签: c++arraysc++11c++-standard-library

解决方案


我被告知这double* name = new double[size];意味着以下内容:«堆栈为指向 ONE double 的指针分配内存并命名指针名称,然后堆分配大小为大小的双精度数组,然后将指针设置为指向第一个元素大批。” 由于上面的代码无法编译,我一定是被教导了一些不正确的东西,因为相同的语法不适用于 std::arrays。

您对该陈述是正确的,但请记住,它的工作方式是new[]new. 当您动态分配 anstd::array时,您调用的是 single-object new,并且返回的指针指向std::array对象本身。

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

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


推荐阅读