0

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

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

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

我没有使用地图的经验,但我看到另一篇文章建议地图可能有用,并且 anstd::map<int, int>似乎类似于vector<vector<int>>.

总结一下:

  1. 有没有办法检查向量“空间”的特定向量是否为空(因为我无法将其与 0 进行比较)
  2. 是否有std::map<int, int>更好的用途,我该如何使用?
4

3 回答 3

3

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

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

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

std::map::find

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

容器有可能非常稀疏。

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

于 2013-02-22T03:28:08.797 回答
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)

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

PS如果只有一个目的地匹配一个来源,你可以继续

map<int,int>

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

于 2013-02-22T03:18:43.833 回答
0

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

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

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

编辑:实现应该足以在地图中使用std::pair的比较运算符,请参阅http://en.cppreference.com/w/cpp/utility/pair/operator_cmpoperator<

于 2013-02-22T03:32:38.400 回答