【发布时间】:2010-10-08 01:12:14
【问题描述】:
在访问复杂性、调整大小时重新分配等方面,我想要的是类似于 STL 向量的东西。我希望它支持任意索引范围,例如可以有从 -2 到 +7 或从 + 索引的元素5 到 +10。我希望能够有效地 push_front。我也想要双向调整大小...
我知道我可以自己写这样的东西,但是如果有已经写好的库支持这个,请告诉我。
【问题讨论】:
在访问复杂性、调整大小时重新分配等方面,我想要的是类似于 STL 向量的东西。我希望它支持任意索引范围,例如可以有从 -2 到 +7 或从 + 索引的元素5 到 +10。我希望能够有效地 push_front。我也想要双向调整大小...
我知道我可以自己写这样的东西,但是如果有已经写好的库支持这个,请告诉我。
【问题讨论】:
给你,双端向量
http://dl.dropbox.com/u/9496269/devector.h
用法:
要在begin() 之前保留内存,请使用reserve(new_back_capacity, new_front_capcity);
除了使用push_front()、pop_front() 和squeeze() 时,始终保留前容量。
squeeze() 刷新所有未使用的内存
默认namespace; stdext
概念:
在大多数情况下等同于 ::std::vector,但具有 push_front 能力
与::std::vector 相比没有性能差异(与::std::deque 不同)
与::std::vector相比有四个字节的开销
【讨论】:
Deque 很像一个向量,它支持随机访问和末尾的高效插入,也支持开头的高效插入。
Map 支持基于任意键的访问,你可以有任何你想要的范围,甚至是一个稀疏的数组。对集合的迭代很慢。
Unordered map (tr1) 与 map 类似,只是它支持更好的迭代。
作为一般经验法则,使用向量(在您的情况下使其适应您想要的行为)并且仅在您有证据表明该向量导致缓慢时才进行更改。
【讨论】:
如果您想要 2 路调整大小等...您可以创建自己的矢量类,其中包含 2 个矢量 一个用于 0 和正值,另一个用于负值。
然后只需实现常用函数并添加新函数(例如:push_begin 添加到负索引向量),并更新里面的对应向量。
【讨论】:
您想要的和向量之间的唯一区别似乎是访问元素所需的偏移量,如果通过重载运算符 [] 或其他东西,您需要注意。除非我不明白你所说的双向调整大小是什么意思。
【讨论】: