std :: map <int,int =“”> vs. vector of vector </int,>

时间:2013-02-22 03:10:17

标签: c++ map containers stdvector

我需要一个容器来根据两个属性source(int)和destination(int)存储一个值(int),即当一个源向目的地发送一些东西时,我需要将它作为元素存储在容器中。源由唯一的int ID(0-M的整数)标识,其中M在数十到数百,因此是目标(0-N)。容器将通过另一个函数的迭代进行更新。

我一直在使用vector(vector(int)),这意味着按照源(目标(值))的顺序。后续流程需要检查此容器,以查看特定源和特定目标中是否存在元素 - 它需要区分空的空格&#39;还有一个。容器有可能非常稀疏。

要存储的值可以是0,所以我没有成功地试图找出空间是否为空,因为我似乎无法做像容器[M] [N]这样的事情。空()。

我没有使用地图的经验,但我看到另一个post表示地图可能有用,而std::map<int, int>似乎与vector<vector<int>>类似。

总结:

  1. 有没有办法检查矢量&#39;空格&#39;的特定向量?是空的(因为我无法将其与0比较)
  2. std::map<int, int>是否更适合此目的,我该如何使用?

3 个答案:

答案 0 :(得分:2)

首先,假设你想要一个等效的结构 vector<vector<int>>

你想要

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

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

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

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

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

myvec.size()

要检查地图中是否存在密钥,请使用

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

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

P.S。如果最多只有一个目标与源匹配,则可以继续

map<int,int>

只需使用count()方法在读取密钥之前查看密钥是否存在

答案 1 :(得分:2)

  

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

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

后续流程需要检查此容器,以查看是否存在   元素存在于特定的源和特定的源   目的地 - 它需要区分一个空的'空间'   和一个填充的。

std::map::find

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

  

容器有可能非常稀疏。

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

答案 2 :(得分:0)

如果您想继续使用矢量但想要检查项目是否包含有效值,请查看boost::optional。该类型现在为std::vector<std::vector<boost::optional<int>>>

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

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

修改:std::pair实现了一个足以在地图中使用的比较运算符operator<,请参阅http://en.cppreference.com/w/cpp/utility/pair/operator_cmp