gpt4 book ai didi

c++ - std::lower_bound 和 std::set::lower_bound 之间的差异

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:56:48 34 4
gpt4 key购买 nike

C++ 草案对 std::lower_bound 说:

§ 25.4.3.1 lower_bound [lower.bound]  
template<class ForwardIterator, class T>
ForwardIterator lower_bound(ForwardIterator first,
ForwardIterator last,
const T& value);
template<class ForwardIterator, class T, class Compare>
ForwardIterator lower_bound(ForwardIterator first,
ForwardIterator last,
const T& value,
Compare comp);

Requires: The elements e of [first,last) shall be partitioned with respect
to the expression e < value or comp(e, value).
Returns: The furthermost iterator i in the range [first,last] such that for
any iterator j in the range [first,i) the following corresponding
conditions hold: *j < value or comp(*j, value) != false.
Complexity: At most log2(last − first) + O(1) comparisons.

请注意,这允许(暗示地)比较与 *ForwardIterator 将返回的不同(但可比较)的类型,但迭代器推进的数量没有复杂性限制。 (对于基于节点的容器,这将是 O(last − first) 迭代器进度。)

§ 23.4.6.1
class set {
...
iterator lower_bound(const key_type& x);
const_iterator lower_bound(const key_type& x) const;
...
}

标准没有详细说明这些功能,但暗示这些功能用于 O(log2(last − first)) 的比较和改进,但要求搜索键与包含的类型相同。

所以我的问题是:
(1) 有没有办法获得std::set::lower_bound的速度和std::lower_bound的搜索类型的灵 active ?
(2) 为什么std::lower_bound 不需要专用于std::set::iterator
(3) 是否有 std::lower_bound 专用于 std::set::iterator 的实现,或者有没有不这样做的原因?

我希望找到类似的东西:

template< class Key, class Comp, class Alloc, class Lookup>  
std::set<Key, Compare, Alloc>::const_iterator
lower_bound(
std::set<Key, Comp, Alloc>::const_iterator begin,
std::set<Key, Comp, Alloc>::const_iterator end,
const Lookup& find,
Compare comp);
template< class Key, class Comp, class Alloc, class Lookup>
std::set<Key, Compare, Alloc>::iterator
lower_bound(
std::set<Key, Comp, Alloc>::iterator begin,
std::set<Key, Comp, Alloc>::iterator end,
const Lookup& find,
Compare comp);

或:

template < class Key, class Compare = less<Key>, class Allocator = allocator<Key> >
class set {
...
template<class Lookup>
iterator lower_bound(const Lookup& x);
template<class Lookup>
const_iterator lower_bound(const Lookup& x) const;
...
}

但我怀疑它是否存在。显然,所有这些都可以扩展到其他基于树的容器和其他算法。我会自己编写代码,但这需要我使用特定于实现的代码。这个想法来自这个问题:Efective search in set with non-key type

最佳答案

A std::set container 根据构造时给出的比较对象排序。当std::lower_bound被调用时,无法检查它是否传递了匹配的比较对象,因此实现无法知道是使用标准算法还是专门用于集合的算法,因为后者仅在使用用于的比较对象时有效集合的排序(或给出相同结果的排序)。

您添加的两个示例原型(prototype)将不起作用:

  1. 专攻 std::lower_bound致力于 std::set迭代器:

    由于上面给出的原因,这将不起作用:无法检查给定的比较对象是否与集合构造函数中给定的对象匹配。你的原型(prototype)只检查比较对象的类型是否匹配,但同一类型可以有不同的比较对象。

  2. 制作 std::set::lower_bound采用模板参数:

    这可能使其与集合的比较对象不兼容,因为该对象的 operator()通常不会被模板化,并且只需要 T 类型的参数.

关于c++ - std::lower_bound 和 std::set::lower_bound 之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7488896/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com