如何使用 lower_bound/upper_bound 从 std::set 获取索引号?
How to use lower_bound/upper_bound to get index number from std::set?
我正在尝试使用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;
}
'
发生错误,指出:
错误:与"运算符-"不匹配(操作数类型为"std::_Rb_tree_const_iterator"和"std::set::迭代器">
如何使用 set 在这里获取返回迭代器的索引号?
PS:我也尝试使用set::lower_bound,但显示相同的错误。
set
的迭代器是双向迭代器,这意味着您不能减去其中的两个。
您可以这样计算距离:std::distance(mn.begin(), it)
但您需要注意,对于双向迭代器,这是一个O(N)
操作 - 而不是恒定时间。
我也遇到了类似的问题,所以我使用了排序向量而不是集合并执行了操作(它 - v.begin(((。
因为它基于一棵树,你不能只是从中随机减去开头。例如,向量是一种线性数据结构,这意味着您可以对其应用这种操作。
如果要执行此操作,可以使用Ordered_set。您可以在gnu_pbds命名空间中找到它。
这是它的链接: https://www.geeksforgeeks.org/ordered-set-gnu-c-pbds/
相关文章:
- 为什么我无法更改"set<set>"循环中的值<int>
- 对于set上的循环-获取next元素迭代器
- 在声明中合并两个常量"std::set"(不是在运行时)
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将 std::set 与基于键的比较器一起使用
- 如何使用set实现无序数据结构?
- 使用运算符调用 void 函数时出错<set>
- 修改"std::set"中用户定义类型的值
- 生成提升::hana::set 的常量表达式问题
- 如何在构造函数参数中初始化"std::set"?
- 如何使用 lower_bound/upper_bound 从 std::set 获取索引号?
- 如何在 C++ 中转发声明 std::set?
- 重构使用动态强制转换的 std::set 的比较运算符
- set::find 查找不存在的元素
- 为什么 std::set.erase(first, last) 会影响从中获取 (first, last) 的容器?
- 将 std:set<int32_t> 复制到 std::set <uint32_t>的好方法
- 错误 C2676:std::set::const_iterator 没有运算符 + 函数?
- std::set 是否将对象连续存储在内存中?
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- google test PrintTo for std::set<std::string>