【问题标题】:How to use lower_bound/upper_bound to get index number from std::set?如何使用 lower_bound/upper_bound 从 std::set 获取索引号?
【发布时间】:2020-05-11 08:44:36
【问题描述】:

我正在尝试使用 STL 提供的二进制搜索功能,该功能需要首先对向量进行排序。所以这就是为什么我试图直接使用 Set 所以我不必先排序。

但是当按如下方式设置时,

`

#include <bits/stdc++.h>
using namespace std;
int main(){
set <int> mn = {11, 33, 44, 66, 80,90};
auto it= mn.lower_bound(55);
cout<<it-mn.begin();
    return 0;
}

`

发生错误:

错误:“operator-”不匹配(操作数类型为“std::_Rb_tree_const_iterator”和“std::set::iterator”

这里如何使用set获取返回的迭代器的索引号?

PS:我也尝试过使用 set::lower_bound,但显示相同的错误。

【问题讨论】:

    标签: c++ stl binary-search stdset


    【解决方案1】:

    set 的迭代器是双向迭代器,这意味着您不能减去其中的两个。

    您可以这样计算距离:std::distance(mn.begin(), it),但您需要注意,对于双向迭代器,这是一个 O(N) 操作 - 不是恒定时间。

    【讨论】:

    • 通常一个有序数组的时间复杂度是 O(n) + O(n * log(n)) 对于向量 vs O(n * log(n)) 对于使用集合,但是在这个因为我必须使用std::distance,所以两者的复杂性是相同的,所以使用set而不是vector没有任何好处,这是正确的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 2011-11-21
    • 2017-08-30
    • 1970-01-01
    相关资源
    最近更新 更多