C ++:由整数键入的对象的映射或向量?

时间:2011-08-02 19:45:50

标签: c++ vector map

我要存储一些由不同数字键入的对象。大多数数字都没有对象,有些会有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?
    }
}

我应该使用地图或矢量吗?我该如何实现这个功能?

4 个答案:

答案 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相同,但在这种情况下它可能更快,因为计算机可以同时查看整数(您的键),而不是简单地通过说“这个键是大于还是小于该键?”来安排它们。 (这是地图的工作方式)