如何解决在自定义容器上使用范围算法的必要要求
我想升级我的自定义容器以兼容 std::ranges
算法,例如 find_if
和其他算法,例如 bellow
auto is_satisfy = [](CustomContainer::value_type x) { ... };
std::ranges::find_if(custom_container,is_satisfy);
// instead of std::find_if(custom_container.begin(),custom_container.end(),is_satisfy);
std::ranges::find_if
的签名像 as
struct find_if_fn {
template< ranges::input_range R,class Proj = std::identity,std::indirect_unary_predicate<std::projected<ranges::iterator_t<R>,Proj>> Pred >
constexpr ranges::borrowed_iterator_t<R>
operator()( R&& r,Pred pred = {},Proj proj = {} ) const
{
return (*this)(ranges::begin(r),ranges::end(r),std::ref(pred),std::ref(proj));
}
};
什么是 input_range concept 以及我自己的自定义容器如何支持此功能?
解决方法
input_range 是什么概念
是这样的:
template<class T>
concept input_range =
range<T> && input_iterator<iterator_t<T>>;
在英文中,input_range 是一个范围,它的迭代器是一个 input_iterator。另一方面,范围概念是:
范围概念定义了一种类型的要求,该类型允许通过提供表示范围元素的迭代器和标记来对其元素进行迭代。
template<class T>
concept range =
requires(T& t) {
ranges::begin(t); // sometimes equality-preserving
ranges::end(t);
};
而 input_iterator 是:
input_iterator 概念定义了一个类型的要求 可以读取引用的值(从要求 间接可读([iterator.concept.readable]))并且可以是 前后递增。 [注 1:与 Cpp17InputIterator 不同 要求([input.iterators]),input_iterator 概念不 需要相等比较,因为迭代器通常与 哨兵。 — 尾注]
template<class I>
concept input_iterator =
input_or_output_iterator<I> &&
indirectly_readable<I> &&
requires { typename ITER_CONCEPT(I); } &&
derived_from<ITER_CONCEPT(I),input_iterator_tag>;
您可以阅读相关概念、功能和特征的规范以了解具体细节。
我自己的自定义容器如何支持此功能?
简而言之:符合上述概念。
中:提供成员函数begin
和end
,其中前者应返回输入迭代器,后者应返回兼容的哨兵类型(可以与迭代器类型相同或不同)。结束哨兵应该从一开始就可以到达,并代表范围的最后一个元素。
总的来说,我建议查看标准容器的 API,以了解它们提供的成员以及它们的工作方式。将设计复制到您的自定义容器中。
引用来自最新的标准草案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。