0

周末我将参加一个编程比赛,我想知道我应该使用std::vector还是std::map?我会简单地将它们用作数组,但我很困惑哪个更好(主要是基本操作的速度)?

我在stackoverflow上看到了这张照片,我不知道这些之间的主要区别是什么......

图片表明矢量更快......我真的不知道该怎么办请帮助我!我只需要像数组一样使用它们,但具有动态大小......在此先感谢,

编辑 我可能会得到一个整数的二维数组(例如城市或迷宫的地图,我会遇到一些可以用图形算法或动态编程解决的问题),所以我需要的是:写,读“表”的特定单元格,搜索特定值,我想就是这样。我听说 std::map 不会在内存中找到完整的 N*M 大小的表,但我会按值进行计算……那么它可能使用更少的内存是真的吗?

对不起,我太傻了,但我从来没有真正的老师,我学到了我所知道的一切。我刚开始学习数据结构(2-3棵树、红黑树、二项式堆等等……)

4

3 回答 3

9

我想知道我应该使用std::vector还是std::map

这完全取决于您想要/需要做什么。如果您需要输入来自用户的 2 个数字,将它们相加并显示结果,那么使用矢量或地图是没有意义的。

但是,如果您需要存储对象(或基元)数组,std::vector通常是要走的路。如果您需要存储键和值,那么这就是std::map发明的目的。你问的问题太宽泛了,所以实际上很难回答,但你可能还是明白了。

此外,您还可以获得一些关于您不应该尝试在此处复制的代码的灵感。

于 2013-01-09T20:47:54.533 回答
1

std::map 不是数组,而是红黑二叉树。因此,作为基本的阵列存储,它不是一个好的选择。

std::vector 可以用作数组,并且可能会提供与数组相似的访问速度(虽然它可能取决于实现,但如果不是全部,大多数将被实现为数组)。std::vector 的优势不是速度,而是它为您管理内存。

此外,您可能想了解不同的数据结构。这将有助于扩展您的编程技能。

于 2013-01-09T20:45:29.033 回答
0

您是指字符数组的 C 意义上的数组还是数学意义上的数组?你的数组是多维的吗?

如果您指的是数学类型,您可能会发现将数组存储在堆中分配的空间中,并通过执行一个新的、更大的 malloc 后跟一个 memcopy 和一个空闲的旧分配区域来调整大小可能比使用 std:containers 更快。

不要被 std: 构造函数所迷惑,它们听起来像是在按空间分配你需要的东西。他们在构造函数时分配了太多空间,所以如果他们没有这个,他们就不必像他们可能的那样经常增长。当它们确实必须增长时,它们会再次出于完全相同的原因再次要求额外的空间。当您确实必须扩展空间时,请记住使用最大的数据项移动数据。假设您有一个 64 位总线并且字符一次移动一个,并且您的编译器不够聪明,无法为您优化它,那么 1/64 的 long 移动速度比 N 字节快。

于 2013-01-09T22:48:13.367 回答