C ++ - 对的映射 - 检查是否存在具有给定第一个坐标的对

时间:2016-01-05 13:27:10

标签: c++ algorithm stl c++14

我拿着一张按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

2 个答案:

答案 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用于外部/内部地图。