C ++:具有两个相关键的快速结构

时间:2016-12-06 14:25:47

标签: c++ search optimization iteration stdmap

我遇到的情况是我有一个容器需要持有ID(ID是唯一的)和数据值。我还需要在订单中保留这些ID。这些变量的元组将由ID查找,但随后按顺序处理到找到的元素,即我并不总是想要处理整个容器。为此,我有一个简单的

解决方案
// ordinal, { ID, data }
std::map<int64, pair<int64, data_t> >

我将首先通过迭代并将搜索值与该对的第一个字段进行比较来搜索ID,给我一个向上走的迭代器,然后我将处理所有元素到这个位置。有没有更好的方法来做到这一点(据我所知,这是O(2n))?

3 个答案:

答案 0 :(得分:0)

如果要对值和键进行索引,可以使用Boost.Bimap。这样你就可以根据它的价值在地图中查找一对。没有这个或类似的,这将必须通过蛮力(=&gt;手动迭代地图)来完成。

否则,您可以使用std::find_if来帮助您找到具有您正在寻找的ID的对,但它与迭代地图的速度相同。

答案 1 :(得分:0)

您可以交换ordinalID并将其存储在地图地图中:

//                 ID              ordinal data
std::unordered_map<int64, std::map<int64, data_t>> container;

这样您就可以在ID时间内找到ordinal给定且O(log N)最少的元素:

container[ID].begin(); // Has ID given, smallest possible ordinal and corresponding data
                       // Equal to container[ID].end() if not found

之后,您可以将找到的对象的ordinal与给定的阈值进行比较。

UP:当然,如果您的ID是唯一的,则嵌套map中不需要:您可以使用std::unordered_map<int64, std::pair<int64, data_t>>

答案 2 :(得分:0)

如果序数严格用于维持秩序并且没有任何差距,我会做一些简单的事情:

    int64_t givenID = whereToQuit;

    std::vector< int64_t >                ordinal_to_ID; 
    std::unordered_map< int64_t, data_t > data_map;

    using datapair_t = std::pair< int64_t, data_t >;
    void do_whatever( datapair_t );

    bool done = false;
    do 
    {
        int64_t ID = ordinal_to_ID[ i ];
        do_whatever( datapair_t( ID, data_map[ ID ]) ); 
        done = ID == givenID;
    }
    while ( !done );