用整型键的对象的map或vector

C++: map or vector for objects keyed by integers?

本文关键字:vector map 对象 整型      更新时间:2023-10-16

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

我应该使用映射还是向量,我应该如何实现这个函数?

您正在寻找的可能是multimap,参见http://www.cplusplus.com/reference/stl/multimap/。

但是你应该指出你的目标到底是什么——内存效率,性能?此外,键值的"分布"如何?如果这是一个重要的决定,你应该原型。

注::不要写

std::vector<std::vector<MyObject>> myObjects;

而不是

std::vector<std::vector<MyObject> > myObjects;  //note the space between the > >

GCC会将>>解释为操作符>>,否则

这实际上取决于您将使用的整数类型。

如果你可能有一个负整数作为键,map是一种选择,因为vector不支持负索引。与此相关的是,如果您不打算使用负键,请考虑使用unsigned int而不是int来为元素设置键,以更清楚地表明键可以是负的。

如果您将有大量的小整数作为键,vector可能是一个很好的选择。基于vector的方法的内存使用将是内存使用0 (U + n),其中U是最大的键,因为vector需要有连续的存储。如果U很小,那么基于vector的方法可能更好。如果U很大,那就用map

但我认为最好的解决方案是使用新的c++ 0x unordered_map,它提供了接近vector的复杂性保证(每个元素的恒定时间查找)和接近map的内存保证(你只支付你正在使用的元素)。这可以使用Boost的容器实现,或者使用TR1实现,或者(如果您有c++ 0x编译器)使用新的标准库来完成。

听起来很像一个带链的哈希映射的候选,或者一个双哈希。

这里有一个重要的问题:作为键的数字是否均匀分布(例如1,6,2,7,4),那么直接使用数字作为向量中的索引将非常有效(O(1)查找)。如果它们不是均匀分布的(例如0、1、10000、100000),那么你将存储大量的空单元格,并使用大量的内存。

在第二种情况下,使用map会好得多。此外,hash_map的行为几乎与map相同,但在这种情况下它可能更快,因为计算机可以一次查看所有整数(键),而不是简单地通过"这个键比那个键大还是小?"来排列它们。(这是地图的工作原理)
相关文章: