std::map 有一个 find() 函数,它只查找完全匹配,因为键被视为单个值(即使由多个元素组成作为您的映射)。
但是,有两种候选解决方案可以解决您的问题,具体取决于您尝试实现的具体目标:
1) 使用 equal_range()
equal_range() 将为您提供由两个迭代器定义的范围。第一个指向一个不小于key的元素,第二个指向第一个大于key的元素。
因此,如果您正在寻找与确切键相关的边界,那么它可能就是您要寻找的:
auto r2 = m.equal_range ({1,2});
if (r2.first!=m.end()) {
std::cout<<"Found range1 -> "<< r2.first->second << std::endl;
}
if (r2.second!=m.end()) {
std::cout<<"Found range2 -> "<< r2.second->second << std::endl;
}
//attention the r2.first==r2.second if exact value not found.
如果您只使用该对的第一个组件来查找边界,它不会为您提供部分搜索。但是您可以使用它来搜索对 (x, 0);这将比仅遍历整个地图更有效。
auto r3 = m.equal_range ({x,0});
for (auto r=r3.first; r!=m.end() && r->first.first==x; r++) {
std::cout<<"In range -> "<< r->second << std::endl;
}
std::cout<<"That's all I found for <<x<<std::endl;
这里是online demo。
2) 使用地图地图
如果您的问题与部分键有关,您只知道第一个元素,那么使用std::map<int, std::map<int, int>> 可能更容易。
然后将简化对部分键的搜索:
auto r3 = m.find (x); // look for first component
if (r3==m.end())
std::cout<<"r3 not found"<<std::endl;
else for (auto r : r3->second) { // iterate on second component
std::cout<<"In range -> "<< r.second << std::endl;
}
然而,这种简单性是以搜索完整键的更高成本为代价的,因为您需要先查找第一个组件,然后再查找第二个组件。
Demo code