是否有理由使用字符串 => 索引到向量的映射,而不是字符串 => 对象?
Is there a reason to use a mapping of string => index into a vector, instead of string => object?
如果我有一个对象集合,我希望能够按名称查找,那么我当然可以使用{ string => object }
映射。
是否有理由将对象的向量与{ string => index into this vector }
伴随映射一起使用?
这些年来,我见过很多开发人员这样做,我基本上认为这表明开发人员不熟悉地图,或者在其他方面感到困惑。但最近几天,我开始重新猜测自己,我担心自己可能错过了一个潜在的优化或其他什么,尽管我一辈子都不知道该优化什么。
我能想到一个原因:
除了按名称查找对象外,有时您还希望尽可能高效地遍历所有对象。使用贴图+矢量可以实现这一点。通过索引访问向量只需支付很小的代价,但通过迭代向量而不是映射,可以获得很大的性能改进(因为向量在连续内存中,而且对缓存更友好)。
当然,您可以使用boost::multiindex做类似的事情,但这对对象本身有一些限制。
我至少能想到几个原因:
- 由于不相关的原因,您需要保留插入顺序
- 您希望多个贴图指向向量(不同的索引)
- 并非矢量中的所有项都需要由字符串指向
没有优化。如果仔细想想,它实际上可能会降低性能(尽管会降低几微秒)。这是因为基于向量的"解决方案"需要额外的步骤才能在向量中找到对象,而非基于向量的解决方案则不必这样做。