如何从特定位置开始搜索地图/多地图

时间:2019-03-10 23:14:59

标签: c++ dictionary search stl binary-search

我想搜索 map / multimap ,但不是全部。相反,我想从一个特定的位置开始。

在下面的示例中,我想找到两个总和 b 的数字。并返回它们的值。

multimap<int, int> a;
a.insert(make_pair(2, 0));
a.insert(make_pair(2, 1));
a.insert(make_pair(5, 2));
a.insert(make_pair(8, 3));

int b = 4;

for(auto it = a.begin(); it != a.end(); ++it) {
    auto it2 = a.find(b - it->first); //Is there an equivalent that starts from "it+1"?
    if(it2 != a.end()) {
        cout << it->second << ", " << it2->second << endl;
        break;
    }
}

输出:

0, 0

所需的输出:

0, 1

是否可以在地图中实现特定位置搜索?

2 个答案:

答案 0 :(得分:1)

  

如何从特定位置开始搜索地图

可以使用std::find。但这不是理想的,因为与地图查找的对数复杂度相比,它具有线性复杂度。 std::map的界面不支持这种查询操作。

如果需要这样的操作,则需要使用其他数据结构。应该可以通过使用父节点指针扩展(平衡)搜索树来实现。缺点当然是增加了内存使用量,并且修改树结构的操作的开销也不断增加。

  

不是从头到尾。

地图查找并非从范围的“开始”开始。它们从树的根部开始。

答案 1 :(得分:0)

如果您使用的是有序地图(听起来很像),那么它已经使用std::find进行了二进制搜索。该函数返回一个迭代器类型,因此假设您正在寻找某个键x的值,然后考虑以下几行:

std::map<char,int> mymap;
mymap['x'] = 24;
std::map<char,int>::iterator itr = mymap.find('x');
std::cout << "x=" << itr->second << std::endl;

未编译代码的原因很可能是因为您试图返回一个配对迭代器,该迭代器将无法正确打印以输出所有效果。而是调用itr->second可以检索与所需键关联的值。