[英]Will std::lower_bound be logarithmic for list<>?
假设我有一个list<int>
并按顺序维护它 state。我可以使用这样的代码以对数复杂度向其中插入新值吗
#include <iostream>
#include <random>
#include <list>
#include <algorithm>
using namespace std;
ostream& operator<<(ostream& out, const list<int> data) {
for(auto it=data.begin(); it!=data.end(); ++it) {
if(it!=data.begin()) {
out << ", ";
}
out << (*it);
}
return out;
}
int main() {
const int max = 100;
mt19937 gen;
uniform_int_distribution<int> dist(0, max);
list<int> data;
for(int i=0; i<max; ++i) {
int val = dist(gen);
auto it = lower_bound(data.begin(), data.end(), val);
data.insert(it, val);
}
cout << data << endl;
}
我会说不是,因为不可能在O(1)
list
中使用 position 迭代器,但文档说很奇怪:
执行的比较次数是第一个和最后一个之间距离的对数(最多 log2(last - first) + O(1) 比较)。 但是,对于非 LegacyRandomAccessIterators,迭代器增量的数量是线性的。 值得注意的是,std::set 和 std::multiset 迭代器不是随机访问,因此它们的成员函数 std::set::lower_bound (resp. std::multiset::lower_bound) 应该是首选。
也就是说,它不建议将这个 function 用于set
,它在内部是 alterady 搜索树。 那么这个 function 打算使用哪些容器呢? 那么如何插入和维护排序呢?
std::lower_bound 会是 list<> 的对数吗?
不。引用文档:
对于非 LegacyRandomAccessIterators,迭代器增量的数量是线性的。
那么这个 function 打算使用哪些容器呢?
std::lower_bound
适用于任何已订购或可以订购的容器,并且没有依赖于其内部结构的更快的下限算法 - 不包括文档中提到的std::set
和std::multiset
.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.