【问题标题】:Queue containing fixed-size arrays in C++C++ 中包含固定大小数组的队列
【发布时间】:2013-02-16 11:51:31
【问题描述】:

我在用 C++ 编写的计算密集型搜索算法中使用queue<vector<int> >。我想用包含固定大小数组的队列或类似的 FIFO 结构替换此数据结构。 如何在 C++ 中做到这一点?

这种替换的动机是减少运行时间。在进行分析时,我注意到在创建向量和向向量中添加东西上花费了相当多的时间。我用固定大小的数组替换了一些关键向量,并测量了 20-50% 的运行时间减少。因此,我想替换上面 FIFO 数据结构中的向量。请注意,所有有问题的代码都是最内层循环的一部分,因此运行时会显着减少。

【问题讨论】:

  • 我看不出制作一个固定大小数组的队列有什么帮助,向量可以廉价地交换和移动,数组不能。
  • 您可能没有想到这一点,但是您是否考虑过将默认容器用于队列适配器,即 std::deque
  • 只是好奇,但您是否在调试中配置文件? vector 在调试中。 @juanchopanza 真的,OP 应该考虑 std::unique_ptr< std::array< int, 10 > >,如果事实证明这个 std::vector 实际上是一个问题,它可以让你快速移动,并具有固定大小缓冲区的大部分优点。
  • @Yakk 我相信我在发布模式下进行分析,因为我更新了 Xcode 方案中的相应条目。

标签: c++ arrays vector queue


【解决方案1】:

您可以使用std::queue<std::array<int, N> > 来具体说明您的要求。一个队列,其中每个元素都是一个固定大小的数组。

或者,您可以将实际数据存储在队列外的缓冲区中,并且只存储指向缓冲区的指针/迭代器。

【讨论】:

  • std::unique_ptr<std::array<int,N>>std::array<int,N> 相比,间接成本适中,但move 对于中等大小的N 或更大的速度要快得多。
  • 是的。它的性能也与他现在拥有的queue<vector<int>> 非常相似。但是,是的,也值得指出这个替代方案
  • 它会阻止不必要的副本。并避免要求reserve,这可以解释性能问题。
猜你喜欢
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 2014-11-15
  • 1970-01-01
  • 1970-01-01
  • 2013-10-14
相关资源
最近更新 更多