【发布时间】:2011-07-05 17:53:06
【问题描述】:
我正在寻找具有以下功能的容器:
- 在运行时固定大小。因此,不应以小块的形式分配内存(如
std::list那样)。 - 元素应该是可交换的(类似于
std::list::splice提供)。
编辑:
考虑一个列表:我只需要将元素从任意位置移动到前面。
编辑2:
我想使用 std::list 之类的东西,但要利用运行时固定大小。
【问题讨论】:
标签: c++ stl containers
我正在寻找具有以下功能的容器:
std::list 那样)。std::list::splice 提供)。编辑:
考虑一个列表:我只需要将元素从任意位置移动到前面。
编辑2:
我想使用 std::list 之类的东西,但要利用运行时固定大小。
【问题讨论】:
标签: c++ stl containers
我会想到 TR1 数组:
std::array<T, int>
或者,如果你还没有,
boost::array<T, int>
这对于所有意图和目的都是相同的。当然,std::swap 对元素的有效性取决于正确的复制构造函数/赋值运算符的可用性。
【讨论】:
boost::array<T, int> 具有编译时间大小。此外,我想使用类似于列表的东西,因为我不想复制元素。
std::vector::resize 是你的朋友。除非需要,否则有适当的保证不会重新分配
我不太清楚你在找什么。想到了两个解决方案:std::vector(以最大大小创建),以及为您的对象很好地实现swap,或者为std::list 的自定义分配器,它预先分配了您将要分配的节点数需要在一个块中。
【讨论】:
allocator。
boost::pool_alloc(独家释放)的性能。 boost 在合适的情况下似乎很好,但在我的场景中,我自己的更快。
您可以在构造时指定std::list 的(初始)大小:
std::list<Type> myList = std::list<Type>(10);
之后你仍然可以扩大/缩小它,但列表将从一开始就包含 10 个默认构造的 Type 对象。
这符合您的需要吗?
【讨论】:
std::list 对我的目的造成的内存碎片过多。
std::vector ?
基于数组。可以指定大小并具有交换功能。
你还没有说你会用它做什么,所以我真的不知道你是否会遇到任何速度问题。
【讨论】: