C :带有两个相关密钥的快速结构

C++: Fast structure with two related keys

本文关键字:密钥 结构 两个      更新时间:2023-10-16

我有一个需要容纳ID(ID是唯一的)和数据值的容器。我还需要按顺序保留这些ID。这些变量的元组将通过ID查找,但然后以直至找到的元素进行处理,即我并不总是想处理整个容器。为此,我有一个简单的解决方案

// ordinal, { ID, data }
std::map<int64, pair<int64, data_t> >

我将首先通过迭代并将搜索值与该对的第一个字段进行比较来搜索ID,从而为我提供一个迭代器,然后将所有元素处理到该位置。有没有更好的方法来执行此操作(用我的计数为o(2n))?

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

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

这将允许您在O(log N)时间内找到带有ID的元素,并最小可能的ordinal

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

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

up:当然,如果您的ID S是唯一的,则嵌套的map中没有必要:您只需使用std::unordered_map<int64, std::pair<int64, data_t>>

如果要索引值和键,则可以使用boost.bimap。这样,您可以根据其值在地图中查找一对。没有这个或类似的情况,必须通过蛮力来完成(=>迭代地图上的地图)。

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

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

    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 );