【问题标题】:C++: std::vector with space reserving for both endsC++:std::vector 两端都有空间保留
【发布时间】:2017-05-27 11:21:18
【问题描述】:

只是一些想法:

我想从大小为 n > x 的 std::vector 的开头擦除 x 个元素。由于向量在内部使用数组,这可以像将 vector.begin() 的指针设置为保留的第一个元素的索引一样简单。但是,erase 会将数组中的所有元素移动到第一个元素实际上从索引 0 开始,这使得擦除操作花费的时间比它可能花费的时间要长。

此外,如果内部数组的有效“区域”实际上仅由向量结构的一些开始和结束索引/指针控制,那么还可以选择在第一个元素前面保留空间。例如,初始化一个向量,最后保留 20 个空格,开头保留 10 个空格。在内部,然后创建一个空间为 30(或 32)的数组,其中起始索引/指针指向内部数组的第 11 个值,允许以恒定速度将新元素包含到“向量”的前面。

嗯,我的意思是,我认为这样的数据结构会有些用处,至少对我的目的而言。我很确定有人已经想到了这一点并且已经实现了它。所以我想问:我所描述的数据结构是怎么命名的?如果它存在,我很乐意使用它。我认为这不是一个双链表,因为在那里,每个元素都是一种结构,其中包含元素值和指向邻居的附加指针(据我所知)。

编辑:是的,这样的结构可能会使用比必要更多的内存,尤其是在从头开始擦除某些元素时,因为那时内部数组仍然具有初始大小。但是,对于大多数问题来说,内存不再是一个大问题,并且可能有一个(耗时的)“内存优化”操作来创建一个新的、更小的数组,复制所有旧值并删除旧的内部数组使用尽可能小的尺寸。

【问题讨论】:

  • 这不是std::deque,但我认为这是标准库中最接近的。
  • std::vector 并没有真正“在内部使用数组”。它通过std::allocate 分配,它使用placement new 来保留内存。它不(也不能)使用new[]
  • 有什么理由不能使用 std::vector<:shared_ptr> ?这将允许您将 null 项保留在前面。
  • 听起来 Boost 的动态环形缓冲区之一的工作方式与您描述的一样:它们可以在不移动现有数据的情况下在两端插入和擦除,当缓冲区已满时,可以重新分配。
  • @kushy 除非您使用新的展示位置,否则不会 - 但这可能不值得努力。

标签: c++ arrays vector data-structures


【解决方案1】:

扩展@Kerrek SB 的评论,boost::circular_buffer&lt;&gt; 我认为您需要什么,例如:

#include <iostream>
#include <boost/circular_buffer.hpp>

int main()
{
  boost::circular_buffer<int> cb(3);

  cb.push_back(1);
  cb.push_back(2);
  cb.push_back(3);

  for( auto i : cb) {
      std::cout << i << std::endl;
  }

  // Increase to hold two more items
  cb.set_capacity(5);
  cb.push_back(4);
  cb.push_back(5);

  for( auto i : cb) {
      std::cout << i << std::endl;
  }

  // Increase to hold two more items
  cb.rset_capacity(7);
  cb.push_front(0);
  cb.push_front(-1);

  for( auto i : cb) {
      std::cout << i << std::endl;
  }  
}

TBH - 我没有看过实现,所以无法评论它是否会移动数据(我会非常惊讶。)但是如果你拉下源代码,如果性能是一个问题,请快速查看一下以满足...

编辑:快速查看代码会发现 push_xxx 操作确实不会移动数据,但是 xxx_capacity 操作确实会导致移动/复制 - 为避免这种情况,请确保环在开始,它会按你的意愿工作......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 2013-10-22
    相关资源
    最近更新 更多