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
?
(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