c++ - 自动将结构数组转换为 C++ 中的数组结构
问题描述
我有一个结构Widget
,里面有几个字段:
struct Widget
{
Some field1;
Another second_field;
...
};
从概念上讲,我需要这些小部件的数组或向量,即std::vector<Widget>
. 但出于性能原因,所有这些字段都应该在它自己的数组中,即:
struct Widgets
{
vector<Some> field1;
vector<Another> second_field;
...
};
那么,鉴于Widget
C++ 中有哪些可能的方法可以将其字段分散在多个向量上,即将结构数组转换为字段数组结构?手动定义一些合理的元数据是可以的(内部或外部Widget
),但首选没有额外元数据的解决方案。
Widget
为了澄清,我正在寻找一种将结构转换为结构的自动或半自动方法Widgets
,而无需手动编码所有样板胶水。
解决方案
核心功能可以使用std::transform
几个 lambda 函数来实现。
要从 a 中获取std::vector<Some>
a std::vector<Widget>
,请使用:
std::vector<Widget> v1 = { ... };
std::vector<Some> v2(v1.size());
std::transform(v1.begin(),
v1.end(),
v2.begin(),
[](Widget const& w) -> Some { return w.field1; });
我会让你弄清楚其余的。
Widget
我正在寻找一种将结构转换为结构的自动或半自动方式Widgets
,而无需手动编码所有样板胶水。
您必须为 . 的每个成员变量编写一些样板代码Widget
。通过使用自己的辅助函数,您将能够稍微减少样板代码的数量。
例如
template <typename FieldType, typename Lambda>
void scatter(std::vector<Widget> const& widgets,
std::vector<FieldType>& fields,
Lmabda l)
{
fields.resize(widgets.size());
std::transform(widgets.begin(), widgets.end(), fields.begin(), l);
}
并将其用作:
std::vector<Widget> v1 = { ... };
Widgets w;
scatter(v1, w.field1, [](Widget const& w) -> Some { return w.field1; });
scatter(v1, w.second_field, [](Widget const& w) -> Another { return w.second_field; });
...
推荐阅读
- javascript - 来自 pwa 的链接在 webview 而不是浏览器中打开
- php - 在条件 MySQL 上减去或添加行值
- java - Java 读取 CSV 文件的行并将其存储到列表列表中
- wordpress - 出价按钮未显示
- c - 如何故意丢失源自可执行文件的数据包
- azure-sql-database - 如何复制 Azure SQL DB 表以及 SSMS 中的数据?
- sql - Azure 数据工厂,遍历来自 RESTFUL API 调用的列表
- google-apps-script - iOS 14.4 中的 Google 脚本编辑器
- go - 在 gdrive 上更改文件后无法立即获取最新版本
- soap - 使用肥皂负载调用端点