我需要一个容器来根据两个属性source(int)和destination(int)存储一个值(int),即当一个源向目的地发送一些东西时,我需要将它作为元素存储在容器中。源由唯一的int ID(0-M的整数)标识,其中M在数十到数百,因此是目标(0-N)。容器将通过另一个函数的迭代进行更新。
我一直在使用vector(vector(int))
,这意味着按照源(目标(值))的顺序。后续流程需要检查此容器,以查看特定源和特定目标中是否存在元素 - 它需要区分空的空格'还有一个。容器有可能非常稀疏。
要存储的值可以是0,所以我没有成功地试图找出空间是否为空,因为我似乎无法做像容器[M] [N]这样的事情。空()。
我没有使用地图的经验,但我看到另一个post表示地图可能有用,而std::map<int, int>
似乎与vector<vector<int>>
类似。
总结:
std::map<int, int>
是否更适合此目的,我该如何使用?答案 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。