Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.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
C++ C+的优势+;地图和向量?_C++_Performance_Dictionary_Vector_Std - Fatal编程技术网

C++ C+的优势+;地图和向量?

C++ C+的优势+;地图和向量?,c++,performance,dictionary,vector,std,C++,Performance,Dictionary,Vector,Std,周末我将参加一个编程比赛,我想知道我应该使用std::vector还是std::map?我只想将它们用作数组,但我不知道哪一个更好(基本操作的速度更快) 我在stackoverflow上看到了这张照片,我不知道它们之间的主要区别是什么 这张图片表明向量更快。。。 我真的不知道该怎么办,请帮帮我!我只需要像数组一样使用它们,但要有动态大小。。。 提前感谢, 编辑 我可能会得到一个二维整数数组(例如一个城市或一个实验室的地图,我会得到一些可以用图形算法或动态规划解决的问题),所以我需要做的事情是:

周末我将参加一个编程比赛,我想知道我应该使用std::vector还是std::map?我只想将它们用作数组,但我不知道哪一个更好(基本操作的速度更快)

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


这张图片表明向量更快。。。 我真的不知道该怎么办,请帮帮我!我只需要像数组一样使用它们,但要有动态大小。。。 提前感谢,

编辑 我可能会得到一个二维整数数组(例如一个城市或一个实验室的地图,我会得到一些可以用图形算法或动态规划解决的问题),所以我需要做的事情是:写入、读取“表”的特定单元格、搜索特定值,我想就这些。 我听说std::map不会在内存中找到完整的N*M大小的表,但我会逐值进行查找。。。那么,它可能会使用更少的内存,这是真的吗


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

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

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

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

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

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

但是,如果需要存储对象(或原语)数组,
std::vector
通常是一种方法。如果您需要存储键和值,那么这就是
std::map
的用途。你问的问题太宽泛了,所以实际上很难回答,但你可能仍然能理解


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

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

如果您指的是数学类型,那么您可能会发现,将数组存储在空间malloced堆中,并通过执行新的、更大的malloc,然后执行memcopy和free-of-the-the-old-malloced区域来调整大小,这可能比使用std:containers要快


不要被std:constructor所愚弄,它听起来像是在按空间分配您需要的内容。他们在构建时占用了太多的空间,所以如果不这样做的话,他们就不必像可能的那样频繁地增长。当它们确实需要生长的时候,它们又因为完全相同的原因要求额外的空间。当您确实需要扩展空间时,请记住使用最大的数据项移动数据。假设您有一个64位总线,字符一次移动一个,并且您的编译器没有足够的智能为您优化,那么长字节的移动速度是N字节的1/64。知道这两者之间的差异是否重要,这是一场竞争?您正在比较关联容器和顺序容器,这有什么意义?这就像问一艘船是否比汽车快——你可以得到一个有效的答案,但它们是满足完全不同需求的工具。“图片表明向量更快…”在特定的时间在特定的机器上执行特定的任务。@nábob:a
vector
是一个有序的元素序列;按顺序存储元素,每个元素都有一个整数;
map
是一个关联容器-您可以存储键值对(只要满足某些约束,它们都可以是任何类型),并且可以通过指定相应的键来检索每个值。你可以在一个指向书架的向量上思考,而地图更像是一本字典。@nábob:如果你需要的话,整数键就可以了。如果你需要索引,那就是矢量。您甚至可以通过使用键作为索引在向量上实现您自己的映射,尽管您的键是稀疏的,您会浪费空间,等等。所有这一切都取决于。你需要后退一步,明白这一点:不要试图直接比较它们。理解每一个单独做什么。为什么
std::map
是一棵红黑树?o、 o它相当于一个键值存储。它可能是用红黑树实现的(虽然没有什么意义),但这是一个实现细节。我应该说它是一个二叉树,尽管我看到的实现是红黑树。你说那没有意义是什么意思?如果需要哈希映射,可以使用std::hash\u映射。然而,这不仅仅是一个实现细节。你应该知道你正在使用的底层算法。更多关于std::map实现的讨论:我试图改进我的问题:我需要使用某种二维整数数组,比如城市地图或类似的东西:)。我听说,如果我不填充“表”/“数组”的所有单元格,则std::map使用的内存会更少,对吗?@nábob问得好,听起来你需要启动一个基准测试工具:)nabob如果不是数组的所有元素都将被填充,你可以创建一个稀疏矩阵。有几种不同的表示法可用于执行此操作。但是,您应该意识到,您将在速度方面受到影响。你真的无法获得比连续内存块更快的速度。@nábob,你还可以创建一个