一般来说,C++中的映射或向量哪个更好?

一般来说,C++中的映射或向量哪个更好?,c++,memory,stl,vector,map,C++,Memory,Stl,Vector,Map,正如我所知,访问向量中的元素需要恒定的时间,而在映射中则需要对数时间。但是,存储地图比存储向量占用的内存更少 因此,我想问,一般来说,哪一个更好?我正在考虑在我的程序中使用这两个元素中的一个,它有大约1000个元素。我计划使用三维向量,它需要1000x1000x1000个元素 这个问题没有正确答案。正确的问题应该是哪个更适合特定的应用程序-在此处插入您的项目-。要选择正确的容器,您需要解释如何使用它。Vector和Map是用于不同目的的两个不同容器。如果有一个更好的,那么另一个就不存在了。地图是

正如我所知,访问向量中的元素需要恒定的时间,而在映射中则需要对数时间。但是,存储地图比存储向量占用的内存更少


因此,我想问,一般来说,哪一个更好?我正在考虑在我的程序中使用这两个元素中的一个,它有大约1000个元素。我计划使用三维向量,它需要1000x1000x1000个元素

这个问题没有正确答案。正确的问题应该是哪个更适合特定的应用程序-在此处插入您的项目-。要选择正确的容器,您需要解释如何使用它。

Vector和Map是用于不同目的的两个不同容器。如果有一个更好的,那么另一个就不存在了。

地图是一个关联容器,它的功能与向量完全不同。如果要将键与值关联,请使用贴图。如果您的键只是非负的连续整数,那么向量在各个方面都是优越的。

通常没有更好的东西。这完全取决于您将要执行的操作以及这些操作的频率


对于相同数量的元素,向量使用的空间不会比贴图多。然而,这样的事情,例如稀疏矩阵,有时可以使用map更有效地实现。

Deque比map更适合替代向量。但这取决于你的需要。向量的所有数据都需要线性内存,而deque则不需要。在大多数情况下,deque is可以作为矢量的替代品。

如果需要键值组件,请使用map。如果您想要一个按数字随机访问的解决方案,或者一个迭代排序的解决方案,请使用vector


查看数据结构/算法分析文本以了解更多信息。

首先,存储地图几乎肯定比矢量占用更多内存,因为矢量只是一个连续块,而地图包含一个树结构

你的问题的答案是哪一个更好取决于你试图解决的问题。这实际上取决于您希望如何为数据编制索引。如果您的数据可以通过整数线性索引,那么vector的性能最佳


但是,在许多情况下,您可能希望以其他方式访问数据。例如,如果希望使用类似字典查找的字符串为数据编制索引,则映射的性能会更好。若要使用向量对字符串数据进行索引,如果不对向量进行排序,则必须对执行线性搜索以查找元素。一个映射只需要执行一个二进制搜索Olog n,这将随着n的增长而加快

坦率地说,建议您创建100000000个空对象来存储1000个有用的对象是很不可思议的。如果你认为一个向量会更快,那么当你考虑所有的SavaPoT抖动、动态内存分配和不必要的对象构造时,你可能会非常错误。p> 应用程序的描述可能过于模糊;但是如果一个值可以被x,y,z索引;然后使用包含x、y、z的对象作为贴图关键点。不需要很长时间就可以找到1000个对象——这是一个非常小的地图。

< P>我认为向量是除向量之外的最佳默认容器选择。如果我有理由选择另一个容器,我会使用另一个容器;如果不是,我使用vector或deque。总的来说,这是我能做的最好的了

所有STL容器都是有原因的,它们比任何其他容器做得都好。如果不知道数据结构的用途,我就无能为力了


然而,使用错误结构的惩罚随着尺寸的增加而增加。如果有几十个元素,任何类都可以。如果你说的是十亿个元素,你真的很想把它做好,并确保你的计算机能够处理它-你可能需要一个有大量RAM的64位应用程序。

如果你有稀疏的三维数组,你可以使用带有键的映射作为索引组合来节省大量内存。对于索引小于1000的情况,键可以是32位无符号整数:

#include <stdint.h> ... int index1 = 12, index2 = 34, index3 = 56; // construct key: uint32_t key = ((index1&0x3FF) << 20) | ((index2&0x3FF) << 10) | (index3&0x3FF) ); // restore indexes: index1 = (key >> 20) & 0x3FF; index2 = (key >> 10) & 0x3FF; index3 = (key) & 0x3FF;
如果您的3D矩阵将被稀疏填充,即大部分为零,那么您将对其感兴趣。如果我没有记错的话,默认情况下,它使用std::map作为底层容器。它为行/列索引以及行/列/元素迭代器提供了运算符

编辑:没关系,我以为boost::ublas有3D矩阵。似乎没有。此外,稀疏_矩阵似乎已被具有稀疏存储的新矩阵类型所取代。我很久没用那个图书馆了


您仍然可以查看Boost.uBlas,从中获得滚动自己的稀疏3D矩阵的灵感。

您确定地图使用的空间比矢量少吗?这取决于您希望如何使用容器。请参阅此流程图:Per
在发布任何类似的问题之前,不妨先读一本关于标准图书馆的书?既然你有了第一段,你为什么要问这个问题!?总的来说,两者都不好;它们适用于不同的应用。还有,为什么一般性地询问,然后给出具体的应用程序!?你的申请描述太模糊;但想想1000x1000x1000=100000000;你真的想为1000个对象使用那么多Gb吗?!一般来说,木工用的锤子和锯子哪个更好?阿门,兄弟!这是一个权衡的问题,通常在生活中是这样的;德克在这里有什么关系?在没有数据压缩的情况下,甚至在通常情况下,没有一种结构不需要线性内存来存储数据。