【问题标题】:std::map<int, int> vs. vector of vectorstd::map<int, int> 与向量的向量
【发布时间】:2013-02-22 03:10:16
【问题描述】:

我需要一个容器来根据源 (int) 和目标 (int) 这两个属性存储值 (int),即当源向目标发送某些内容时,我需要将其作为元素存储在容器中。源由唯一的 int ID(从 0-M 的整数)标识,其中 M 在几十到几百之间,目标 (0-N) 也是如此。容器将通过另一个函数的迭代来更新。

我一直在使用vector(vector(int)),这意味着按源(目标(值))的顺序。后续过程需要检查此容器,以查看特定源和特定目的地的元素是否存在 - 它需要区分空的“空间”和填充的“空间”。容器有可能非常稀疏。

要存储的值可以是 0,所以我没有成功尝试找出空间是否为空,因为我似乎无法执行 container[M][N].empty() 之类的操作。

我没有使用地图的经验,但我看到另一个 post 表明地图可能有用,而 std::map&lt;int, int&gt; 似乎类似于 vector&lt;vector&lt;int&gt;&gt;

总结一下:

  1. 有没有办法检查向量“空间”的特定向量是否为空(因为我无法将其与 0 进行比较)
  2. std::map&lt;int, int&gt; 是否更适合此目的,我该如何使用?

【问题讨论】:

  • 哇哇哇...vector&lt;vector&lt;int&gt;&gt; 是与std::map&lt;int, int&gt; 完全不同的动物...
  • 非空单元格与总单元格的预期平均比率是多少?它很低,然后地图更好。如果它很高,那么应该考虑一个向量。应该通过剖析来确定截止点的确切位置。
  • 在我看来 map&lt;pair&lt;int,int&gt;, int&gt; 可能更合适 - pair&lt;int,int&gt; 将是源-目标 ID。
  • @MichaelBurr 我是新手,但你如何使用它?是map information (1,1) = 0;吗?

标签: c++ map containers stdvector


【解决方案1】:

我需要一个容器来根据两个属性存储一个值(int), 源 (int) 和目标 (int)

std::map<std::pair<int, int>, int>

后续进程需要检查这个容器,看看是否有 元素存在于一个特定的来源和一个特定的 目的地 - 它需要区分一个空的“空间” 和一个装满的。

std::map::find

http://www.cplusplus.com/reference/map/map/find/

容器有可能非常稀疏。

使用 std::map。容器的“正确”选择取决于您需要如何查找内容以及需要如何插入/删除内容。如果您想快速找到东西,请使用地图。

【讨论】:

  • 另外,operator[] 通常是一首警笛曲,它看起来很优雅,但是如果找不到一个元素就会插入一个元素(大多数时候你不想要这个)行为)
【解决方案2】:

首先,假设你想要一个等价的结构 vector&lt;vector&lt;int&gt;&gt;

你会想要的

std::map<int,std::vector<int>>

因为对于映射中的每个键,只有一个唯一值。

如果您的源以 0...N 的顺序非常紧密地索引,将进行大量查找,并且很少删除,您应该使用向量的向量。

如果您的来源具有不严格遵循顺序的任意 ID,或者如果您要进行大量插入/删除,则应使用 map&lt;int,vector&lt;int&gt;&gt; - 通常由二叉树实现。

要检查向量的大小,请使用

myvec.size()

要检查映射中是否存在键,请使用

mymap.count(ID) //this will return 0 or 1 (we cannot have more than 1 value to a key)

我使用地图有一段时间了,尽管我与专家相距甚远,但它们对我来说非常方便用于存储和修改数据之间的连接。

附:如果只有一个目的地与来源相匹配,您可以继续

map<int,int>

在读取之前使用count()方法查看key是否存在

【讨论】:

    【解决方案3】:

    如果您想继续使用向量,但想添加检查项目是否包含有效值,请查看boost::optional。现在的类型是std::vector&lt;std::vector&lt;boost::optional&lt;int&gt;&gt;&gt;

    您也可以使用地图,但地图的键必须是两个 ID 而不是一个。

    std::map<std::pair<int,int>,int>
    

    编辑:std::pair 实现了一个比较运算符 operator&lt;,它应该足以在地图中使用,请参阅 http://en.cppreference.com/w/cpp/utility/pair/operator_cmp

    【讨论】:

    • 与 map::find() 相比,boost 似乎有点矫枉过正?
    • @JoshPetitt,我根本不会争论这一点。有时有选择真是太好了。例如,可能存在性能差异。
    • 同意,我认为 Tim Towtdi 说得最好 :-)
    猜你喜欢
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    相关资源
    最近更新 更多