我拿着一张按std::pair<K, V>
排序的地图。 (它的类型是std::map<std::pair<K, V>, size_t>
)。我想找到给定第一个坐标的任意对(即K
固定,查找地图中是否有任何对象,使用格式为std::pair<K, _>
的关键字,我不关心第二个坐标)。显然它可以在O(log n)中完成,因为搜索特定对也是在O(log n)[标准的find()操作]中完成的。有没有办法做到这一点,而无需从头开始编写我自己的地图?
还有一件事 - 我不能改变比较函数,因为我希望像(1,2), (1,3)
这样的对不同,如果比较器只比较键,它会将它们视为等号。我想保留标准的find()操作,因为我也需要使用它。
Finding any element with specific first coordinate in set<pair> >
的解决方案不起作用,因为我只保证为operator <
和K
提供V
。我不知道std::numeric_limits
是否专门针对K
答案 0 :(得分:1)
如果您需要任何值且密钥等于x
,请使用V
的虚拟值。如果它是默认构造的,你可以把V()
作为密钥的第二个虚拟元素;否则从地图中选择值(例如从第一个元素)。然后使用该键搜索lower_bound
并查看上一个元素:
auto it = my_container.lower_bound(std::make_pair(x, V()));
bool found;
if (it == my_container.end()) {
found = false;
} else {
found = it->first.first == x;
if (!found && it != my_container.begin()) {
it--;
found = it->first.first == x;
}
}
答案 1 :(得分:-1)
我建议将地图分成两张地图:
create index on :Person(uri);
create index on :All_Movies(name);
MATCH (mainGuy:Person { uri:'http://example.com/foo' })<-[:IN]-(movie1:Movie)<-[:TYPE|:SUBTYPE*1..3]-(allM:All_Movies)
WHERE allM.name = 'Lionheart'
WITH distinct movie1
MATCH ( nonMoF:Person)<-[:IN]-(movie1),( nonMoF)<-[:ACTED_IN]-(movie2)
MATCH (movie2:Movie)<-[:TYPE|:SUBTYPE*1..3]-(allM2:All_Movies )
WHERE allM2.name = 'Lionheart'
WITH movie2, collect(movie1) as movies
MATCH ( reqGuy:Person)<-[:ACTED_IN]-( movie2)
MATCH (reqGuy)<-[:NAME*0..3]-(cnBlah:OtherData)
WITH reqGuy, collect(distinct cnBlah) as cnBlahs, movies
MATCH (oin656:IdInfo)<-[r:OTHER*0..3]-(reqGuy) WHERE not(()-[:NAME]->(oin656))
RETURN reqGuy, cnBlahs , collect(distinct oin656) as oins, movies;
使用make_pair执行对构造/解构并获取。
如果您不需要保留订单,还可以考虑将unordered_multimap / unordered_map用于外部/内部地图。