【问题标题】:C++: map or vector for objects keyed by integers?C++:以整数为键的对象的映射或向量?
【发布时间】:2011-08-02 19:45:50
【问题描述】:

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

我应该使用地图还是矢量,我应该如何实现该功能?

【问题讨论】:

    标签: c++ vector map


    【解决方案1】:

    您正在寻找的可能是多图,请参阅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 将 >> 解释为运算符>> 否则。

    【讨论】:

    • 多重地图,或者[boost::|std::tr1::]unordered_multimap
    【解决方案2】:

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

    如果您可能曾经有一个负整数作为键,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 编译器)使用新的标准库来完成。

    【讨论】:

      【解决方案3】:

      听起来真的很适合使用链式哈希映射或双哈希。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2020-04-28
          • 2012-08-29
          • 1970-01-01
          • 2016-01-08
          • 1970-01-01
          • 2011-06-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多