【问题标题】:Flexible and fast container at runtime运行时灵活快速的容器
【发布时间】:2014-11-26 12:03:29
【问题描述】:

我需要像std::array 这样的固定大小(快速)容器来存储这样的用户输入

用户输入:

n = {2,3,2,1}

生成的输出(在运行时):

m = {{2x3},{3x2},{2x1}}

如何归档对m 的快速访问?普通的std::vector 好像太慢了。

【问题讨论】:

  • "... 似乎太慢了。" 你在什么具体情况下测量了什么?您可以使用已调整大小的std::vector<>
  • 请考虑您的程序逻辑将比用户输入和最终输出快无数倍。让我们说快十亿倍,只是为了取一个数字,尽管这个数字太小了。为什么还要更快?
  • 为什么std::vector 在你看来这么慢?
  • 等待... 访问向量的时间很慢?使用权?与普通数组相比,访问向量的开销很小。为了获得比你需要进入工程领域更快的东西,比如缓存管理和其他东西。
  • “在我看来,非固定大小的容器有点慢” - 在发布模式下构建每种方法,使用合适的测试进行配置,发布结果证明向量是不够的 - 否则它没有发生。

标签: c++ stl


【解决方案1】:

由于您明确要求固定大小std::array 确实是您想要的。虽然大小是恒定的,但内容不是,因此您可以将用户输入写入std::array 就好了。

然而,你不能确定你想要的就是你应该想要的。将用户输入输入固定大小的容器是一个非常糟糕的主意,向量的有效额外开销是一次内存分配(和一次空闲操作),这对于在程序启动时仅发生一次的事情几乎不重要。
@ 987654323@ 意味着初始分配的额外开销可以忽略不计,但它保证无论用户提交多少数据,您始终可以推送它而不会出现缓冲区溢出。这是一个非常可接受的成本的巨大事情。

如果您使用operator[]at 成员函数检查边界!)并且您不在调试模式下编译或任何诸如“内存清理器”选项之类的东西,例如LLVM 提供。

调试模式和清理程序功能显然确实会增加开销,但这与您将要发布的发布二进制文件大不相同,毕竟这也是您所要求的。

此外,像“似乎很慢”这样的陈述几乎肯定会给你负面的回应。永远不要猜测什么可能会很慢(衡量,不要猜测),也不要过早地这样做。

【讨论】:

    【解决方案2】:

    std::vector 似乎是事情,因为它基于数组。考虑两件事:

    • 使用 [] 访问而不是 at()(但一定要提供正确的索引);
    • 使用 vec.resize(expectedSize) 准备矢量以减少(或完全排除)调整大小的开销。

    【讨论】:

      猜你喜欢
      • 2011-04-27
      • 1970-01-01
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      相关资源
      最近更新 更多