gpt4 book ai didi

c++ - 使用 std::initializer_list[] 作为可变长度列表的常量列表

转载 作者:行者123 更新时间:2023-11-30 03:14:22 26 4
gpt4 key购买 nike

我需要一个 static const list of varying length(来自 Qt 的 QPointF),我直接在我的代码中初始化(见下文),并且稍后仅以只读方式使用在。

我第一次使用const std::vector<QPointF>[]为此,但后来我发现我可以使用 const std::initializer_list<QPointF>[]相反(const 是否必要?)。

static const std::initializer_list<QPointF> points[6] = {
{ { 0.50f, 0.50f } },
{ { 0.25f, 0.25f }, { 0.75f, 0.75f } },
{ { 0.25f, 0.25f }, { 0.50f, 0.50f }, { 0.75f, 0.75f } },
{ { 0.25f, 0.25f }, { 0.75f, 0.75f }, { 0.25f, 0.75f }, { 0.75f, 0.25f } },
{ { 0.25f, 0.25f }, { 0.75f, 0.75f }, { 0.50f, 0.50f }, { 0.25f, 0.75f }, { 0.75f, 0.25f } },
{ { 0.25f, 0.25f }, { 0.75f, 0.75f }, { 0.25f, 0.50f }, { 0.75f, 0.50f }, { 0.25f, 0.75f }, { 0.75f, 0.25f } },
};

这是对 std::initializer_list 的有效使用吗? ?对我来说这看起来像是一个 hack,可能是因为 std::iniatilizer_list 的名字暗示某种用途。 this的答案帖子还提到初始化列表旨在用于初始化例如容器。

我也考虑过const std::array<...>[] , 但所有内部列表的长度必须相同。

如果std::initializer_list在这里不是正确的选择,那么如何正确地做到这一点。替代品std::vector由于堆分配感觉不对。

最佳答案

了解您的编译器输出可以帮助您做出这个决定。 std::initializer_list<>just a thin wrapper around an array of objects .

如果你真的需要静态常量数据,std::initializer_list<>[]是完全有效的(只要您不介意使用它的访问语法而不是像在 std::array<>std::vector<> 上找到的下标运算符)。 Clang 8 降低每个 initializer_list在数组中到它自己的固定长度数组 QPointF结构。然后它用对 QPointF 的引用填充另一个数组。它创建的数组:

// pseudo-C++ from Clang's generated output

QPointF RT1[1] = { { 0.50f, 0.50f } };
QPointF RT2[2] = { { 0.25f, 0.25f }, { 0.75f, 0.75f } };
QPointF RT3[3] = { { 0.25f, 0.25f }, { 0.50f, 0.50f }, { 0.75f, 0.75f } };
QPointF RT4[4] = { { 0.25f, 0.25f }, { 0.75f, 0.75f }, { 0.25f, 0.75f }, { 0.75f, 0.25f } };
QPointF RT5[5] = { { 0.25f, 0.25f }, { 0.75f, 0.75f }, { 0.50f, 0.50f }, { 0.25f, 0.75f }, { 0.75f, 0.25f } };
QPointF RT6[6] = { { 0.25f, 0.25f }, { 0.75f, 0.75f }, { 0.25f, 0.50f }, { 0.75f, 0.50f }, { 0.25f, 0.75f }, { 0.75f, 0.25f } };

// Reference array:
QPointF* points[6] = { RT1, RT2, RT3, RT4, RT5, RT6 };

访问列表中的单个值

(points[5].begin() + 3)->y

降低到本质上相当于

points[5][3].y
// alternatively:
(*(*(points + 5) + 3)).y
// which is actually:
(*(RT5 + 3)).y

(std::initializer_list<>::begin() 的实现可能不同。)

因此,如果您不介意隐藏的取消引用或不同的语法风格,这很好。 (尽管数组或 vector 也会发生取消引用。)

尝试使用不同的优化级别并查看结果:https://godbolt.org/z/Vwjbp2

关于c++ - 使用 std::initializer_list[] 作为可变长度列表的常量列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57894444/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com