【问题标题】:How to search in a map/multimap starting from specific position如何从特定位置开始在地图/多地图中搜索
【发布时间】:2019-08-01 06:21:48
【问题描述】:

我想在 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

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

【问题讨论】:

  • std::map::find() 不会“搜索整个容器”。如果是这样,它的复杂性将是O(n)。但事实并非如此。就算法而言,std::find_if() 使用适当的谓词可以轻松处理地图的std::pair。结论:检查你的假设,并解释真正的问题。不,不是所说的那个,而是那个解决方案涉及以这种方式搜索地图的那个。
  • 正如山姆所说,您的问题是基于一些错误的假设。 edit 您的问题最好包含您要解决的实际问题,包括 minimal reproducible example
  • 感谢您的 cmets。我添加了一个我正在尝试做的例子。如果不可能或者我使用了错误的容器也没关系,我只是想知道我是否错过了一种方法。
  • 如果你想“找到和 b 相加的前两个数字”,那么使用地图是没有意义的。这不是地图的用途。您正在尝试将某些东西用于其他非设计用途。

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


【解决方案1】:

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

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

如果你需要这样的操作,那么你需要使用另一个数据结构。应该可以通过使用父节点指针扩充(平衡)搜索树来实现。缺点当然是增加了内存使用和修改树结构的操作的持续开销。

不是从头到尾。

地图查找不是从范围的“开始”开始的。它们从树的根开始。

【讨论】:

  • find_if 或 binary_search 之类的 stl 算法怎么样?
  • @asantacreu 您只能将binary_search 与随机访问迭代器一起使用。映射迭代器不是随机访问。您确实可以使用find_if。但请注意,与地图查找的对数复杂度相比,它具有线性复杂度。
【解决方案2】:

如果您使用的是有序映射(听起来很像),那么它已经使用 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-&gt;second 允许您检索与所需键关联的值。

【讨论】:

    猜你喜欢
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多