c++ - 我们可以在 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。
这提出了几个问题:
- 该声明的实际含义是
type* name = new othertype[size];
什么? - 如何使用 std::array 实现我想要的?
- 最后,如何使用 std::unqiue_ptr 和 std::make_unique 实现相同的效果?
解决方案
我被告知这
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
.
推荐阅读
- android-dialogfragment - Android DialogFragment 中的文本被截断
- python - 如何在 C 模块中包含 Python 包?
- r - left_join 嵌套列表
- google-apps-script - 使用工作表模板插入新工作表不起作用
- javascript - D3.js:让 x 轴在时间序列图中每秒平滑过渡?
- matlab - 如何在 MATLAB 中正确使用 screenRect 函数?
- r - 按下按钮时如何显示数据表?
- r - 使用 stat_summary 将 ggplot 转换为灰度
- r - 逐行计算并将结果写入具有变量名的列中
- html - 引导程序“容器”内
标签