我遇到的情况是我有一个容器需要持有ID(ID是唯一的)和数据值。我还需要在订单中保留这些ID。这些变量的元组将由ID查找,但随后按顺序处理到找到的元素,即我并不总是想要处理整个容器。为此,我有一个简单的
解决方案// ordinal, { ID, data }
std::map<int64, pair<int64, data_t> >
我将首先通过迭代并将搜索值与该对的第一个字段进行比较来搜索ID,给我一个向上走的迭代器,然后我将处理所有元素到这个位置。有没有更好的方法来做到这一点(据我所知,这是O(2n))?
答案 0 :(得分:0)
如果要对值和键进行索引,可以使用Boost.Bimap。这样你就可以根据它的价值在地图中查找一对。没有这个或类似的,这将必须通过蛮力(=&gt;手动迭代地图)来完成。
否则,您可以使用std::find_if来帮助您找到具有您正在寻找的ID的对,但它与迭代地图的速度相同。
答案 1 :(得分:0)
您可以交换ordinal
和ID
并将其存储在地图地图中:
// 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 );