我要存储一些由不同数字键入的对象。大多数数字都没有对象,有些会有1个,有些会有多个。
std::map<int, std::vector<MyObject>> myObjects;
// or...
std::vector<std::vector<MyObject>> myObjects;
std::vector<MyObject> GetObjectsForNumber( int number )
{
// how best to do this?
if ( -check if there is a vector for the number- )
{
return myObjects[number];
// or...
return myObjects.at(number);
}
else
{
// return empty vector?
}
}
我应该使用地图或矢量吗?我该如何实现这个功能?
答案 0 :(得分:5)
您正在寻找的可能是多图,请参阅http://www.cplusplus.com/reference/stl/multimap/。
但你应该指出你的目标是什么 - 记忆效率,表现?此外,如何在键上“分配”值?如果这是一个重要的决定,你应该做原型。
P.S。:不要写
std::vector<std::vector<MyObject>> myObjects;
而是
std::vector<std::vector<MyObject> > myObjects; //note the space between the > >
GCC将解释&gt;&gt;作为运算符&gt;&gt;否则。
答案 1 :(得分:5)
这实际上取决于你将要使用的整数类型。
如果你可能有一个负整数作为键,map
是要走的路,因为vector
不支持负指数。在相关的说明中,如果您不会使用否定键,请考虑使用unsigned int
而不是int
来键入元素,以便更清楚地知道键可能是负数。
如果你有大量的小整数作为键,vector
可能是一个不错的选择。基于vector
的方法的内存使用量将具有内存使用量O(U + n),其中U是最大密钥,因为vector
需要具有连续存储。如果U
很小,那么基于vector
的方法可能会更好。如果U
很大,请使用map
。
但我认为最好的解决方案是使用新的C ++ 0x unordered_map
,它提供的复杂性保证接近vector
(每个元素的常量时间查找)与内存的复杂性保证保证接近map
的保证(您只需支付您正在使用的元素)。这可以使用Boost的容器实现,或者使用TR1实现,或者(如果你有一个C ++ 0x编译器)使用新的标准库来完成。
答案 2 :(得分:2)
真的听起来像是带有链接或双哈希的哈希映射的候选者。
答案 3 :(得分:0)
这是一个重要的问题: 您用作密钥的数字是否均匀分布(例如1,6,2,7,4),然后将数字直接用作向量中的索引将非常有效(O(1)查找)。如果它们不是均匀分布的(例如0,1,10000,100000),那么你将存储大量空单元并使用大量内存。
在第二种情况下,使用地图会好得多。此外,hash_map的行为几乎与map相同,但在这种情况下它可能更快,因为计算机可以同时查看整数(您的键),而不是简单地通过说“这个键是大于还是小于该键?”来安排它们。 (这是地图的工作方式)