C ++ std :: map和std :: vector的优点?

时间:2013-01-09 20:42:42

标签: c++ performance dictionary vector std

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

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

图片显示矢量更快...... 我真的不知道该怎么办请帮助我!我只需要像数组那样使用它们但是具有动态尺寸...... 提前谢谢,

修改 我可能会得到一个2D整数数组(例如一个城市或一个labirinth的地图,我会得到一些可以用图形算法或动态编程解决的问题),所以我需要的是:写,读取“表”的特定单元格,搜索特定值,我想这就是全部。 我听说std :: map不会在内存中找到完整的N * M大小的表,但我会按值计算它...所以它可能会使用更少的内存吗?

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

3 个答案:

答案 0 :(得分:9)

  

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

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

但是,如果您需要存储一个对象(或基元)数组,std::vector通常是要走的路。如果您需要存储密钥和值,那么std::map就是为此而发明的。你问的问题太宽泛了,所以回答它实际上非常困难,但你仍然可以理解。

此外,您可以获得一些您永远不应该尝试复制here的代码的灵感。

答案 1 :(得分:1)

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

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

此外,您可能希望阅读不同的数据结构。它将有助于扩展您的编程技能。

答案 2 :(得分:0)

你的意思是字符数组的C意义上的数组或数学意义吗?你的阵列会是多维的吗?

如果你的意思是数学类型,你可能会发现将数组存储在堆中的malloced中并通过执行一个新的更大的malloc然后使用memcopy并且没有旧的malloced区域来调整大小可能比使用std更快:容器

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