【问题标题】:Creating t* array with adresses to t array fields创建 t* 数组,其中包含 t 个数组字段的地址
【发布时间】:2022-01-13 00:23:16
【问题描述】:

下面的代码可以缩短吗?

size_t n_arr{4};
int arr[4]{1, 4, 5, 6};
int* arr_p[4];

for (; n_arr—; )
   arr_p[i] = &arr[i];

地址都是链接在一起的,那么有没有更有效的方法来抓取一个地址块并将它们存储在另一个数组中?

【问题讨论】:

  • 你为什么需要它?单独存储地址而不是在需要时动态计算它们有什么好处?
  • 我可以通过旋转的单独数组访问一个主数组。因此,当我调用*arr_p[0] 时,它可能会因为不同的旋转与主阵列上的不同位置相关联。例如,对于游戏板起始位置很有用。

标签: c++ arrays


【解决方案1】:

你可以的

#include <numeric>
...
std::iota(std::begin(arr_p), std::end(arr_p), arr);

其中std::iota 通常用于生成整数的连续范围,它是通用的,因此会生成从arr(它本身是&amp;arr[0] 的缩写)开始的连续指针范围。

更明确地说,

#include <algorithm>
...
std::transform(std::begin(arr), std::end(arr), arr_p, [](int& x) { return &x; });

通过引用获取每个元素并使用指向这些元素的指针填充arr_p

https://godbolt.org/z/T8KGshn68

【讨论】:

  • 这是个绝招。 :)
【解决方案2】:

我想你可以这样写:

size_t n_arr{4};
int arr[4]{1, 4, 5, 6};
int* arr_p[4];
int *narr_p;
int **arr_pp;

narr_p = arr;
arr_pp = arr_p;
for (; n_arr--; )
   *arr_pp++ = narr_p++;

但正如 Yksisarvinen 所写,拥有一个顺序指针数组似乎不是很有用。

编辑:稍微更优雅的表述(在我看来):

size_t n_arr{4};
int arr[4]{1, 4, 5, 6};
int* arr_p[4];

for (int **arr_pp = arr_p, *narr_p = arr; n_arr--; )
   *arr_pp++ = narr_p++;

第三个:

size_t n_arr{4};
int arr[4]{1, 4, 5, 6};
int* arr_p[4];

for (int **arr_pp = arr_p, *narr_p = arr; n_arr--; *arr_pp++ = narr_p++);

【讨论】:

  • 我不认为我可以从中获取新数组,因为它现在是一个指针。但非常好的想法,加上。在我的情况下,最好的实现可能是arr_p[n_arr] = arr++;,我只需要更改 for 循环。不过,你真的能数出数组吗?
  • 你不需要获取新数组,指针只是一个辅助变量。 arr_p 包含最后的指针。
  • 想象arr_p 是一本书,arr_pp 只是一个书签,显示您当前所处的位置。
  • 没关系,编辑修复了它,谢谢
  • 是的,对不起。在作业中,我忘记了左侧需要一个左值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 2013-05-31
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多