我的数据如下:
1-> (2,3),(4,5),(6,7),(8,2) //up to 10000 values
9-> (4,5),(7,90),(8,1),(9,10) //up to 1000000 values
11-> (9,10),(11,2),(12,1)
...
我想要一个适合快速查找两个键值的数据结构:行和列,因此find(9, 7)
应该从上面的示例中提供90
。
请注意,值序列已经排序,并且我对查找时间比插入时间更感兴趣。
答案 0 :(得分:3)
我推荐
map<int, set<pair<int, int> > >
std::set
是已排序容器。
请注意,您必须使用比较函数(operator<
)声明该集合,以便它知道按其第一个元素对其对进行排序。
答案 1 :(得分:2)
我不确定我理解这个问题,但是......
map<int, vector<pair<int, int>>
是您示例的直接翻译。如果您的密钥不需要保持有序,请使用unordered_map
。
这在空间方面非常有效,因为向量只是连续地将所有对包装在内存中,并且每对只是一个具有两个字段的简单结构类对象。
答案 2 :(得分:1)
您可以使用的容器是:
std::map<key,value>
,提供对数时间查找std::unordered_map<key,value>
,提供持续时间查询std::vector<pair<key,value>>
,它提供对数时间查找。它占用的空间比前两个少,但构建速度较慢,查找代码更复杂。似乎符合您要求的最简单的事情是:
std::unordered_map<int, std::unordered_map<int,int> >
请注意,这会丢弃一些信息,因为值类型不再排序......但查找行为应该仍然很好。
如果你想出于某种原因保持排序(请在声明速度之前先进行基准测试),你可以使用
std::unordered_map<int, std::vector<std::pair<int,int> > >
并使用标准库提供的二进制搜索算法(例如std::lower_bound
)。