C++ 设置方法以获得比给定元素少的元素数?

C++ 设置方法以获得比给定元素少的元素数?,c++,stl,set,C++,Stl,Set,set是否支持返回小于给定元素数的元素数的任何方法 我知道我们有一个下界,它将迭代器返回到给定元素的下界;但它不会返回给定元素之前的元素数 我知道我可以从头迭代到下限迭代器;但在最坏的情况下,这需要时间。在Ologn中我们有这样做的方法吗?如果您专门有一个std::set,那么您可以像这样使用自定义: auto lb = s.lower_bound(key); auto count = std::distance(s.begin(), s.lower_bound(key)); auto lb

set是否支持返回小于给定元素数的元素数的任何方法

我知道我们有一个下界,它将迭代器返回到给定元素的下界;但它不会返回给定元素之前的元素数


我知道我可以从头迭代到下限迭代器;但在最坏的情况下,这需要时间。在Ologn中我们有这样做的方法吗?

如果您专门有一个std::set,那么您可以像这样使用自定义:

auto lb = s.lower_bound(key);
auto count = std::distance(s.begin(), s.lower_bound(key));
auto lb = std::lower_bound(s.begin(), s.end(), key);
auto count = std::distance(s.begin(), lb);
这保证了OLOGN的复杂性

要获得元素的计数,可以使用以下命令:

auto lb = s.lower_bound(key);
auto count = std::distance(s.begin(), s.lower_bound(key));
auto lb = std::lower_bound(s.begin(), s.end(), key);
auto count = std::distance(s.begin(), lb);
但是,std::set不支持随机访问迭代器,因此std::distance调用的复杂性很高

如果您有一些排序范围,您仍然可以像下面这样使用下限和距离:

auto lb = s.lower_bound(key);
auto count = std::distance(s.begin(), s.lower_bound(key));
auto lb = std::lower_bound(s.begin(), s.end(), key);
auto count = std::distance(s.begin(), lb);

但是请注意,如果s不支持随机访问,那么这两个操作都会增加复杂性。

我不确定从哪里获得std::distance.begin,s.lower_boundkey;具有很高的复杂性。当然,对lower_bound的调用是这样的,但是对distance的调用是为一个可能更小的用户打开的n@MarshallClow如果输入还满足LegacyRandomAccessIterator的要求,那么复杂性是恒定的。我有什么误解吗?你缺少的是一个集合没有随机访问迭代器。@MarshallClow这是真的,谢谢。编辑了答案。