【问题标题】:which is better in general, map or vector in c++?一般而言,c ++中的地图或矢量哪个更好?
【发布时间】:2010-05-07 19:56:48
【问题描述】:

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

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

【问题讨论】:

  • 您确定地图使用的空间比矢量少吗?
  • 取决于你想对容器做什么。看这个流程图:linuxsoftware.co.nz/containerchoice.png
  • 在发布更多此类问题之前,也许阅读有关标准库的书?
  • 鉴于你的第一段,你为什么要问这个问题!?一般来说,两者都不是更好。它们适用于不同的应用。另外为什么要问“一般”,然后给出具体的应用程序!?您的应用程序的描述过于模糊;但想想 1000x1000x1000 = 1,000,000,000;你真的要为 1000 个对象使用那么多 Gb 吗?!
  • 一般来说,木工中的锤子和锯子哪个更好?

标签: c++ memory stl vector map


【解决方案1】:

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

【讨论】:

  • 阿门,兄弟!这完全是取舍的问题(通常在生活中通常是这样的;)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      您的问题的答案是哪个更好,这取决于您要解决的问题。这实际上归结为您希望如何为您的数据建立索引。如果您的数据可以按整数线性索引,则向量将表现最佳。

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

      【讨论】:

        【解决方案5】:

        一般来说,没有比这更好的了。这完全取决于您将要执行的操作以及这些操作的频率。

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

        【讨论】:

          【解决方案6】:

          如果你有稀疏的 3 维数组,你可以使用 map 和 key 作为索引的组合来节省大量内存。对于索引 #include ... int index1 = 12, index2 = 34, index3 = 56; //构造键: uint32_t 键 = ((index1&0x3FF) > 20) & 0x3FF; index2 = (key >> 10) & 0x3FF; index3 = (key) & 0x3FF;

          【讨论】:

            【解决方案7】:

            坦率地说,建议您创建 1,000,000,000 个空对象来存储 1000 个有用的对象,这很荒谬。如果您认为向量会更快,那么当您考虑所有随之而来的交换文件抖动、动态内存分配和不必要的对象构造时,您可能就大错特错了!

            您的应用程序的描述可能过于模糊;但是如果一个值可以由 x,y,z 索引;然后使用包含 x,y,z 的对象作为映射键。只需定位 1000 个对象不会花费很长时间 - 这是一张非常小的地图。

            【讨论】:

              【解决方案8】:

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

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

              【讨论】:

                【解决方案9】:

                我认为vector<> 是容器的最佳默认选择(vector<bool> 除外)。如果我有理由更喜欢另一个容器,我会使用另一个;如果没有,我使用vector<>(或deque<bool>)。这是我所能达到的“总体上更好”的程度。

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

                但是,使用错误结构的惩罚会随着大小的增加而增加。如果你有几十个元素,任何类都可以。如果您谈论的是十亿个元素,那么您确实希望正确处理它(并确保您的计算机能够处理它 - 您可能需要一个具有大量 RAM 的 64 位应用程序)。

                【讨论】:

                  【解决方案10】:

                  双端队列比映射更适合替代向量。但这取决于您的需求。向量的所有数据都需要线性内存,但双端队列不需要。在大多数情况下,双端队列可以用作向量的替代品。

                  【讨论】:

                  • 双端队列在这里有何相关性?如果没有数据压缩,通常即使有数据压缩,也不会有不需要线性内存来存储数据的结构。
                  【解决方案11】:

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

                  编辑:没关系,我认为 boost::ublas 有 3D 矩阵。似乎没有。似乎sparse_matrix 已被具有稀疏存储的新矩阵类型所取代。我已经很久没有使用那个库了。

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

                  【讨论】:

                    猜你喜欢
                    • 2010-10-02
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-10-25
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多