我需要能够做到:
MySet<double> s;
/* some insertions, other ops... */
int idx = s.getElemenetIndex(-15.3);
并且对于idx,如果-15.3不在集合中,则为-1,或者集合中的相对索引为-15.3(即集合中的某个唯一元素的getElemenetIndex()
等于0,另一个-1,...到设定大小-1)。我不关心排序是什么,只是它存在。
std::set()
执行此操作吗?我的意思是,在时间复杂度O(log(n))中,n = s.size()?我知道它的底层实现,一个红黑树,允许这个...... std::set
,也许是其他一些随时可用的套装类?或者我需要自己滚动吗?备注:
getElementIndex()
之前进行的。getElementIndex()
之前)必须是O(log(n))摊销;删除不需要任何支持。答案 0 :(得分:2)
类似的东西:
std::set<double> s { 5.5, 6.6, 7.7, 8.8 };
auto idx=std::distance(begin(s), s.find(7.7));
查找是对数的,我相信std::distance
最坏的情况是O(N)。
编辑:当然我建议你首先检查find
对end(s)
的结果,然后将整个事情包装在一个函数中。
答案 1 :(得分:2)
鉴于在最初填充之后您不需要修改该集,请使用已排序的向量。
push_back
填充(未排序):按元素分摊O(1)std::sort
排序:O(N * log(N))总计,O(log(N))每个元素摊销std::lower_bound
找到迭代器:O(log(N))std::distance
转换为索引:O(1)