具有可预测键的关联容器:使用哪一个?

时间:2012-10-27 08:06:37

标签: c++ stl

一个简单的问题,但答案对我来说并不明显:出于性能原因,从性能的角度来看,我应该使用哪种map-type(或者可能是非map-type?)容器,最好在以下场景中使用:< / p>

  • 键是无符号整数,
  • 插入频繁,
  • 读访问更频繁,随机访问,
  • 以升序键值插入项目(第一个插入的项目具有键0,下一个键1,依此类推),
  • 项目被随机删除(因此相应的项目已被删除,因此密钥列表迟早会有“漏洞”)。移除几乎与插入一样频繁。

我犹豫使用std::map,因为升序键顺序和频繁删除似乎意味着搜索树的连续重新平衡,这对我来说似乎是浪费性能。

换句话说:我可以事先知道项目的关键是什么,甚至是插入键的顺序,也能获得性能吗? (不过我不知道项目的总数。)

2 个答案:

答案 0 :(得分:4)

如果您使用stl::map - 即使只是为了与分析进行比较 - 您可以使用“使用升序键值插入项目”的知识来大大提高{的效率{1}}通过给插入调用提示提示插入操作:

stl::map

... iterator insert ( iterator position_hint, const value_type& x ); 所在的位置,例如,插入前一项的迭代器。

答案 1 :(得分:3)

如果内存不是问题,为什么不使用某些自定义类型的std::vector?您可以拥有最快的访问时间,因为所有元素都是有序的,如果元素被删除,只需保存一个标记。考虑这个代理类:

template<typename RealType>
class MyProxy {
public:
    RealType instance;
    bool isused;


    MyProxy(RealType) { /* TODO */ }
};

然后在std::vector

中使用
std::vector<MyProxy<MyRealType> > vec;

对于查找,您只需检查索引是否在std::vector的范围内,isused标志是true。要删除,只需获取索引i的元素并将标志设置为false。要进行插入,您必须push_back MyProxy<MyType>而不是MyType的新实例。

这种方法的缺点当然是std::vector不断增长,所以你必须留意内存消耗并最终释放vector,但这可能是最快的方法用于查找,插入和删除。