一个简单的问题,但答案对我来说并不明显:出于性能原因,从性能的角度来看,我应该使用哪种map-type(或者可能是非map-type?)容器,最好在以下场景中使用:< / p>
我犹豫使用std::map
,因为升序键顺序和频繁删除似乎意味着搜索树的连续重新平衡,这对我来说似乎是浪费性能。
换句话说:我可以事先知道项目的关键是什么,甚至是插入键的顺序,也能获得性能吗? (不过我不知道项目的总数。)
答案 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
,但这可能是最快的方法用于查找,插入和删除。