哪个更好,一般来说,地图或c ++中的矢量?

时间:2010-05-07 19:56:48

标签: c++ memory stl vector map

我知道访问向量中的元素需要恒定的时间,而在map中需要对数时间。但是,存储地图比存储矢量占用的内存少。

因此,我想问哪一个更好?我正在考虑在我的程序中使用其中一个,它有大约1000个元素。我打算使用3维向量,这将需要1000x1000x1000个元素。

11 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:9)

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

答案 2 :(得分:7)

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

答案 3 :(得分:5)

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

你的问题的答案更好,这取决于你试图解决的问题。这实际上取决于您希望如何索引数据。如果您的数据可以用整数线性索引,那么向量将表现最佳。

但是,在许多情况下,您需要以其他方式访问您的数据。例如,如果要使用字符串(如字典查找)索引数据,则地图将表现更好。要使用向量使用字符串索引数据,如果不保持向量排序,则必须执行线性搜索(O(n))以查找元素。地图只需要执行二进制搜索(O(log n)),随着n的增长,这将快得多。

答案 4 :(得分:3)

总的来说,没有更好的东西。这完全取决于您要执行的操作以及这些操作的频率。

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

答案 5 :(得分:2)

坦率地说,你创建1,000,000,000个空对象来存储1000个有用的对象,这是非常荒谬的。如果你认为向量会更快,那么当你考虑所有交换文件抖动,动态内存分配以及随之而来的不必要的对象构造时,你可能会非常错误!

您的申请说明可能过于模糊;但是如果一个值可以用x,y,z索引;然后使用包含x,y,z的对象作为地图键。只需要找到1000个物体就可以了很长时间 - 这是一个非常小的地图。

答案 6 :(得分:2)

如果您有稀疏的三维数组,则可以使用带有键的映射作为索引组合来节省大量内存。对于索引< 1000,key可以是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;


答案 7 :(得分:1)

Deque比矢量更适合替代矢量。但这取决于你的需求。向量需要线性内存用于其所有数据,但deque不需要。在大多数情况下,deque可用作替代矢量的下降。

答案 8 :(得分:1)

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

检查数据结构/算法分析文本以获取更多信息。

答案 9 :(得分:1)

我认为vector<>是容器的最佳默认选择(vector<bool>除外)。如果我有理由喜欢另一个容器,我会使用另一个容器;如果没有,我使用vector<>(或deque<bool>)。这就像我能够“更好地”一样接近。

所有STL容器都有原因,它们比其他容器做得更好。在不知道您将使用数据结构的情况下,我无法提供任何帮助。

但是,使用错误结构的处罚会增加。如果你有几十个元素,任何类都可以。如果你正在谈论十亿个元素,你真的想要把它弄好(并确保你的计算机能够处理它 - 你可能需要一个带有大量RAM的64位应用程序。)

答案 10 :(得分:0)

如果您的3D矩阵将被稀疏填充(即大多数为零),那么您将对boost::ublas::sparse_matrix感兴趣。如果我没记错的话,默认情况下,它使用std::map作为底层容器。它为操作符提供了简单的行/列索引(以及行/列/元素迭代器)。

编辑:没关系,我认为boost :: ublas有3D矩阵。它似乎没有。似乎sparse_matrix已被具有稀疏存储的新矩阵类型所取代。自从我使用该库以来已经很长时间了。

你仍然可以看看Boost.uBlas在滚动你自己的稀疏3D矩阵时的灵感。

相关问题