是否有理由使用字符串 => 索引到向量的映射,而不是字符串 => 对象?

Is there a reason to use a mapping of string => index into a vector, instead of string => object?

本文关键字:gt 字符串 对象 映射 索引 有理由 是否 向量      更新时间:2023-10-16

如果我有一个对象集合,我希望能够按名称查找,那么我当然可以使用{ string => object }映射。

是否有理由将对象的向量{ string => index into this vector }伴随映射一起使用?

这些年来,我见过很多开发人员这样做,我基本上认为这表明开发人员不熟悉地图,或者在其他方面感到困惑。但最近几天,我开始重新猜测自己,我担心自己可能错过了一个潜在的优化或其他什么,尽管我一辈子都不知道该优化什么。

我能想到一个原因:

除了按名称查找对象外,有时您还希望尽可能高效地遍历所有对象。使用贴图+矢量可以实现这一点。通过索引访问向量只需支付很小的代价,但通过迭代向量而不是映射,可以获得很大的性能改进(因为向量在连续内存中,而且对缓存更友好)。

当然,您可以使用boost::multiindex做类似的事情,但这对对象本身有一些限制。

我至少能想到几个原因:

  • 由于不相关的原因,您需要保留插入顺序
  • 您希望多个贴图指向向量(不同的索引)
  • 并非矢量中的所有项都需要由字符串指向

没有优化。如果仔细想想,它实际上可能会降低性能(尽管会降低几微秒)。这是因为基于向量的"解决方案"需要额外的步骤才能在向量中找到对象,而非基于向量的解决方案则不必这样做。