在 C 或 C++ 中,您能否以类似于初始化字符串指针数组的方式初始化整数数组指针数组?

问题描述 投票:0回答:1

在 C 或 C++ 中,您可以声明:

const char *foo[] = {
        "hello",
        NULL,
        "cruel",
        NULL,
        NULL,
        "world",
};

有什么方法可以使这种简单干净的初始化语法适用于(const)整数数组而不是字符数组(又名字符串常量),同时仍然允许 NULL?

因此,您是否可以使用某种初始化列表语法,例如

"hello"
"world"
等字符串,而不是像
&{ 1, 4, 12}
&({ 0, 4, 9 })
这样的字符串?或者字符串只是语法中的特殊情况?

我查看了初始化“指向整数数组的指针”,但没有帮助。另外,这是 11 年前提出的问题,也许更新的 C 或 C++ 标准可能会提供一种方法?


如果相关:

  • 整数数据是预先计算好的并且不变。
  • 出于查找目的,指向整数数组的每个指针自然属于指针数组
    foo
    的特定索引位置。这不是任意的。
  • 对于用户想要处理的某个数据集中的每个项目,他们将使用一个简单的数学公式来导出一个整数数值。因此,如果他们从数学中导出(例如)
    0
    ,那么他们需要在
    foo[0]
    中查找以找到指向相应数组的指针(例如)
    1, 4, 12
  • 包含
    NULL
    的索引位置在数学上是不可能的,并且永远不会被访问。
  • 每个整数数组都具有相同的维度。
  • 然而,近 80% 的指针将是
    NULL
    ,因此 2D 数组将是浪费的。
  • 尺寸会很大,但不会大到从文件中读取是唯一明智的选择。比如说,一个由 5,000 个指针组成的数组,指向由 1,000 个整数组成的数组(其中 80% 的指针是
    NULL
    )。声明
    foo
    的包含文件将自动生成。
c++ arrays c pointers
1个回答
0
投票

因此,如果他们从数学中得出(例如)0,那么他们需要在 foo[0] 中查找指向相应数组的指针(例如)1、4、12。

我认为您希望

std::unordered_map
在计算出的索引值和相应的数组之间进行映射。

示例:

std::unordered_map<size_t, std::vector<int>> foo;
foo[0] = { 1, 4, 12 };
foo[1] = { 0, 4, 9 };
foo[99] = {11,22,33};

或者在较新版本的 C++ 上:

std::unordered_map<size_t, std::vector<int>> foo = {
    {0, { 1, 4, 12 }},
    {1, {0,  4,  9 }},
    {99, {11, 22, 33}}
};

然后引用特定元素:

auto& lookup = foo[99]; // reference assignment
std::cout << lookup[0] << " " << lookup[1] << " " << lookup[2] << std::endl;

上面将打印:

11 22 33

© www.soinside.com 2019 - 2024. All rights reserved.