Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有理由使用string=>;的映射;索引到向量中,而不是字符串=>;对象_Java_C++_Performance_Optimization_Data Structures - Fatal编程技术网

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

Java 是否有理由使用string=>;的映射;索引到向量中,而不是字符串=>;对象,java,c++,performance,optimization,data-structures,Java,C++,Performance,Optimization,Data Structures,如果我有一个可以按名称查找的对象集合,我当然可以使用{string=>object}映射 是否有理由将对象向量与{string=>索引一起使用到此向量}伴随映射 这些年来,我看到很多开发人员都这么做,我基本上不认为这表明开发人员对地图不熟悉,或者对其他方面感到困惑。但最近几天,我开始怀疑自己,我担心我可能会错过一个潜在的优化或其他东西,尽管我一辈子都不知道什么可以优化。没有优化。如果您仔细想想,它实际上可能会降低性能(尽管会降低几微秒)。这是因为基于向量的“解决方案”需要额外的步骤才能在向量中找

如果我有一个可以按名称查找的对象集合,我当然可以使用
{string=>object}
映射

是否有理由将对象向量与
{string=>索引一起使用到此向量}
伴随映射


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

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

我可以想到一个原因:

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


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

我至少可以想到几个原因:

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

如果您首先拥有向量,或者希望保持其顺序,则可以使用您描述的方案。它在概念上与数据库文件的概念相匹配,在数据库文件上有一个索引。如果您需要一个对象向量,但也需要一个字符串->对象映射,该怎么办?它还允许您非常轻松地更改名称->对象映射,或者允许您将多个名称映射到同一个对象。在垃圾收集的世界中,不让对象保持活动状态可能是安全的。将“索引”(字符串+索引)的存储与核心数据(对象)分开是很有用的