从具有运行时索引的元组中选择一组值

2024-03-12

简短介绍我的问题: 我正在尝试使用 stl 容器实现“某种”关系数据库。这只是出于娱乐/教育目的,因此不需要诸如“使用这个库”、“这绝对没用”之类的答案。 我知道此时标题有点令人困惑,但我们会达到目的(非常欢迎改进标题的建议)。

我采取了一些小步骤:

  1. 我可以将表构建为从列名称到其值的映射向量=>std::vector<std::map<std::string, some_variant>>。它很简单,它代表了我所需要的。
  2. 等等,我可以只存储列的名称一次并使用其索引访问值。 =>std::vector<std::vector<some_variant>>.就像第 1 点一样简单,但比这更快。
  3. 等等,在数据库中,表实际上是元组的序列=>std::vector<std::tuple<args...>>。这很酷,它准确地代表了我正在做的事情,没有变体的正确类型,甚至比其他更快。

注:“快于”是针对 1000000 条记录,用一个简单的循环,如下所示:

std::random_device dev;
std::mt19937 gen(dev());
std::uniform_int_distribution<long> rand1_1000(1, 1000);
std::uniform_real_distribution<double> rand1_10(1.0, 10.0);

void fill_1()
{
    using my_variant = std::variant<long, long long, double, std::string>;
    using values = std::map<std::string, my_variant>;
    using table = std::vector<values>;

    table t;
    for (int i = 0; i < 1000000; ++i)
        t.push_back({ {"col_1", rand1_1000(gen)}, {"col_2", rand1_1000(gen)}, {"col_3", rand1_10(gen)} });
    std::cout << "size:" << t.size() << "\n";//just to prevent optimization
}
  1. 2234101600ns - 平均:2234

  2. 446344100ns - 平均:446

  3. 132075400ns - 平均:132

INSERT:这些解决方案中的任何一个都没有问题,插入就像示例中推回元素一样简单。

SELECT:1和2很简单,但3很棘手。

所以,最后,问题是:

  1. 内存使用情况:就使用的内存而言,使用解决方案 1 和 2 会产生大量开销。所以,3 似乎又是正确的选择。 对于 100 万条记录 2 的示例longs and a double我预计长整型需要接近 4MB*2,双打需要 8MB,再加上使用的向量、映射和变体的一些开销。相反,我们有(用 Windows 任务管理器测量,不是很准确,我知道):

    1.340 MB

    2.120 MB

    3.31 MB

    我错过了什么吗?除了提前预订合适的尺寸或shrink_to_fit在插入循环之后?

  2. 有没有办法像 select 语句一样在运行时检索某些元组字段?

using my_tuple = std::tuple<long, long, string,  double>;
std::vector<my_tuple> table;
int to_select;//this could be a vector of columns to select obviosly
std::cin>>to_select;
auto result = select (table, to_select);

您认为有机会以任何方式实现最后一行吗?我所看到的我们有两个问题:结果类型应该从起始元组中获取类型,然后实际执行所需字段的选择。

我读了很多关于这个问题的答案,他们都谈论使用连续索引make_index_sequence或编译时已知索引。 我还发现本文 https://www.justsoftwaresolutions.co.uk/cplusplus/getting-tuple-elements-with-runtime-index.html,非常有趣,但对于本例来说并不是很有用。


这是可行的,但很奇怪:

template<size_t candidate, typename ...T>
constexpr std::variant<T...> helperTupleValueAt(const std::tuple<T...>& t, size_t index)
{
    if constexpr (candidate >= sizeof...(T)) {
        throw std::logic_error("out of bounds");
    } else {
        if (candidate == index) {
            return std::variant<T...>{ std::in_place_index<candidate>, std::get<candidate>(t) };
        } else {
            return helperTupleValueAt<candidate + 1>(t, index);
        }
    }
}

template<typename ...T>
std::variant<T...> tupleValueAt(const std::tuple<T...>& t, size_t index)
{
    return helperTupleValueAt<0>(t, index);
}

https://wandbox.org/permlink/FQJd4chAFVSg5eSy https://wandbox.org/permlink/FQJd4chAFVSg5eSy

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从具有运行时索引的元组中选择一组值 的相关文章

  • 从 unsigned char* 到 char* 的转换无效

    这是一个代码 1 int main int argc char argv 2 3 signed char S psc 4 unsigned char U pusc 5 char C pc 6 7 C S 8 C U 9 10 pc psc
  • 基于多线程的 RabbitMQ 消费者

    我们有一个 Windows 服务 它监听单个 RabbitMQ 队列并处理消息 我们希望扩展相同的 Windows 服务 以便它可以监听 RabbitMQ 的多个队列并处理消息 不确定使用多线程是否可以实现这一点 因为每个线程都必须侦听 阻
  • ptrace和waitpid有什么关系?

    我正在练习使用ptrace但我不太了解它和之间的关系waitpid 这是我的测试程序 int main int argc char argv pid t pid 22092 if ptrace PTRACE ATTACH pid NULL
  • 为什么下面的重叠比较总是评估为 true

    我不明白为什么以下代码有警告 指出重叠比较始终评估为真 接下来的语句永远不会被执行 QVariant MainModel data const QModelIndex index int role const if index isVali
  • 在 T4 代码生成中,如何从引用的程序集中获取类型?

    由于 T4 在项目上下文之外运行 因此我无权访问当前程序集或其他程序集 如何注册对引用程序集的访问 然后从中获取类型 我猜您想访问项目中建筑物的程序集 我在下面的示例代码中所做的是将一个名为 TestLib 的项目添加到我的解决方案中 我将
  • C 中的双重否定:是否保证返回 0/1?

    Is x 标准保证返回0 1 请注意 我是not询问 C 其中定义了 bool 类型 是的 在 C99 中 请参阅 6 5 3 3 4 逻辑非运算符的结果 是0如果其操作数的值比较 不等于0 1如果其操作数的值比较等于 0 结果具有类型in
  • 使用正则表达式解析日志文件

    我目前正在为我们的内部日志文件 由 log4php log4net 和 log4j 生成 开发一个解析器 到目前为止 我有一个很好的正则表达式来解析日志 除了一个烦人的一点 一些日志消息跨越多行 我无法正确匹配 我现在的正则表达式是这样的
  • 如何修复此 YCrCb -> RBG 转换公式?

    我使用的公式来自这个问题 https stackoverflow com questions 8838481 kcvpixelformattype 420ypcbcr8biplanarfullrange frame to uiimage c
  • WPF ComboBox 中具有本地化名称的枚举

    我有一个列出枚举的组合框 enum StatusEnum Open 1 Closed 2 InProgress 3
  • 是否可以在对Where 的调用中调用命名方法?

    我试图从 RedGate 的这本免费电子书中了解 Linq 的一些性能影响ftp support red gate com ebooks under the hood of net memory management part1 pdf f
  • C++ 更改屏幕方向问题 -- DEVMODE dmDisplayOrientation DMDO_90 undefined

    我似乎无法编译一些 C 代码 我正在翻转显示器的方向 但 VS2008 告诉我 DMDO 90 和 DMDO 270 无法识别 error C2065 DMDO 90 undeclared identifier error C2065 DM
  • 这个元组创建习惯有名字吗?

    On the 增加邮件列表 http lists boost org Archives boost 2014 06 214213 php LouisDionne 最近发布了以下创建类似元组的实体的巧妙技巧 include
  • 使用 C# 的异步 WebRequest

    您好 我有一个函数 它将 url Get 参数传递到网络服务器上的 php 文件 并等待文件的响应 通常需要 10 20 秒 我想将其放入一个循环中 因为我必须一次将这些 Get 请求发送到大约 5 个不同的 php 文件 但是当我尝试将其
  • PowerShell 与 MongoDB C# 驱动程序方法不兼容?

    由 C 泛型引起的最新 MongoDB 驱动程序的问题 Cannot find an overload for GetCollection and the argument count 1 我可能可以使用其他没有泛型的 GetCollect
  • 为什么将未使用的返回值转换为 void?

    int fn void whatever void fn 是否有任何理由将未使用的返回值强制转换为 void 或者我认为这完全是浪费时间 David s answer https stackoverflow com questions 68
  • OpenSSL:无需 SSL_read() / SSL_write() 即可执行加密/解密

    我已经用 C 语言编写了一个基于事件的网络库 现在我想通过 OpenSSL 添加 SSL TLS 支持 而不是使用SSL read and SSL write 我宁愿让 OpenSSL 只执行传出 传入数据的加密 解密 让我自己传输 接收数
  • 提升shared_from_this<>()

    有人可以用几句话概括一下如何提升shared from this lt gt 应该使用智能指针 特别是从使用绑定函数在 io service 中注册处理程序的角度来看 编辑 一些回复要求提供更多背景信息 基本上 我正在寻找 陷阱 即人们使用
  • 使用 List.Contains 方法为 LINQ 构建表达式树

    Problem 我正在重构一些LINQ查询我们的 Web 应用程序中的多个报告 并且我尝试将一些重复的查询谓词移至它们自己的中IQueryable扩展方法 以便我们可以将它们重新用于这些报告以及将来的报告 正如您可能推断的那样 我已经重构了
  • 从最大到最小的3个整数

    我是 C 初学者 我使用 编程 使用 C 的原理与实践 第二版 问题如下 编写一个程序 提示用户输入三个整数值 然后以逗号分隔的数字顺序输出这些值 如果两个值相同 则应将它们排列在一起 include
  • C#“var”关键字在 VB.NET 中的等价物是什么?

    例如 我如何获得 VB NET静态类型局部变量是static赋值右侧的表达式的类型 像这样 Dim http msdn microsoft com en us library 7ee5a7s1 aspx我的变量 3 你还需要 选项推断 ht

随机推荐

  • C++:有效但未指定的状态。这是什么意思? [复制]

    这个问题在这里已经有答案了 我一直在尝试理解 std move This http www cplusplus com reference utility move doc描述得很好 但它在示例部分中说 而 bar 失去了它的值 现在处于有
  • 如何将值注入 TensorFlow 图的中间?

    考虑以下代码 x tf placeholder tf float32 name x z x tf constant 5 0 y tf mul z tf constant 0 5 with tf Session as sess print s
  • jQuery Ajax 请求每 30 秒一次

    我有这段代码 但当有人访问我的网站时 这些值可能会发生变化 我需要每 30 秒左右更新一次 finance div 这可以做到吗 function getJSON http query yahooapis com v1 public yql
  • 输入字符串 1 无效 UTF-8 Shiny 应用程序

    我正在尝试创建一个闪亮的应用程序并不断收到错误Warning Error in sub input string 1 is invalid UTF 8这阻止了我的selectInput从出现 我尝试过使用utf8包将字符串转换为有效的 UT
  • 将一台机器中一个节点的elasticsearch索引移动到同一台机器的另一个驱动器

    我的机器中有一个 elasticsearch 节点 配有 150gb SSD 和 3 TB HDD 由于 SSD 空间不足 我想将一个索引从 SSD 移动到 HDD 这可能吗 如果是这样怎么办 我可以在硬盘上创建另一个节点 但我宁愿在机器上
  • 获取 Woocommerce 订阅的订阅产品作者

    如何遍历所有当前活跃的 woo 订阅并打印发布与每个活跃订阅 PHP 相关的产品的用户的用户 ID 我认为这样的东西只会提供订阅 args array subscriptions per page gt 1 post type gt sho
  • Matlab:使用互协方差对齐数据

    我想获得 Matlab 中两个数据集之间样本的偏移量 让它们及时同步 这是一个很常见的问题 因此 我使用互相关函数 xcorr 或互协方差函数 xcov 在大多数情况下 两者都为此目的提供类似的结果 对于人工数据 它工作得很好 但我在处理
  • Chai-As-Promised 正在吃断言错误

    我在用着柴如许诺 mocha为了写一些硒网络驱动程序测试 由于 webdriver 广泛使用promises 我想如果我使用 chai as promised 进行此类测试会更好 问题是 当测试失败时 mocha 没有正确捕获错误 它只是失
  • 有没有办法检查一个列表的所有元素是否都包含在球拍的另一个列表中?

    我想要一个执行类似操作的函数 gt function 1 2 3 4 1 2 3 4 5 t 在这种情况下返回 t 因为第一个列表的所有元素都包含在第二个列表中 有没有一个函数可以做到这一点而不必担心顺序 在这种情况下 您不会将列表进行比较
  • 如何以百分比形式设置 Ext.grid.ColumnModel 中的宽度?

    如何设置宽度Ext grid ColumnModel以百分比计算 使用总共 100 的列宽数字并使用 ForceFit 配置视图 例如 var grid new Ext grid GridPanel cm new Ext grid Colu
  • 我需要事务来进行连接查询吗?

    在带有连接的sql查询期间 我需要使用事务吗 我在想这样的事情 Delete table1 table2 table3 FROM table1 INNER JOIN table2 ON LEFT JOIN table3 ON WHERE t
  • 正则表达式获取捕获组的大小

    是否可以编写一个正则表达式 以便我可以稍后在同一正则表达式中引用 第一个捕获组的长度 我在这里想要实现的是捕获连续发生的情况1后面跟着连续出现的确切次数2 s 我想要类似的东西 r 1 2 length 1 where length 1 s
  • 防止 Windows 程序将 ^Z 解释为文件结尾

    我的工作是翻译一个从 C 到 C 的应用程序 该应用程序已安装在 Linux 发行版上 所以我希望 C 和 Linux 的功能 我在读取二进制文件时遇到问题 它说当它遇到一个时到达EOFctrl Z到达文件实际末尾之前的字符 bash 中宝
  • Angular 2:在模板内使用光滑的轮播

    我使用光滑的轮播作为我的角度项目中的组件 这个光滑的组件如下所示 Component selector slick slider template
  • 如何获取当前 UINavigationController 的引用?

    在 Objective C 中 获取当前 UINavigationController 引用的最佳方法是什么 我想从任何可能没有引用 UIController 委托或其他任何内容的类访问它 是否有现有的方法来获取当前的 UINavigati
  • 使用 R 中的 dplyr 和摘要向每一行添加哈希

    我需要向数据集中的每一行添加指纹 以便检查同一组的更高版本以查找差异 我知道如何为 R 中的每一行添加哈希 如下所示 data frame iris hash apply iris 1 digest 我正在学习使用dplyr由于数据集变得越
  • Jetpack Compose 是否有创建自定义过度滚动效果的工具?

    有没有办法在jetpack compose中创建过度滚动效果 像这样的事情 过度滚动效果可以通过以下方式控制LocalOverscrollConfiguration 目前有以下参数 GlobeColor 发光效果的颜色 如果平台效果是发光效
  • json.dumps \u 将 unicode 转义为 utf8

    我来自这个老讨论 https stackoverflow com questions 18337407 saving utf 8 texts in json dumps as utf8 not as u escape sequence 但该
  • 从磁盘读取的文本不符合换行符

    Using the Text widget with text that s read from disk that contains new line characters n does not go to new line Anyone
  • 从具有运行时索引的元组中选择一组值

    简短介绍我的问题 我正在尝试使用 stl 容器实现 某种 关系数据库 这只是出于娱乐 教育目的 因此不需要诸如 使用这个库 这绝对没用 之类的答案 我知道此时标题有点令人困惑 但我们会达到目的 非常欢迎改进标题的建议 我采取了一些小步骤 我