template<class BIDirIt,class UnaryPred>BIDirIt partition(BIDirIt first,BIDirIt last,UnaryPred pred,std::bIDirectional_iterator_tag){ while (true) { while ((first != last) && pred(*first)) { ++first; } if (first == last) { break; } --last; while ((first != last) && !pred(*last)) { --last; } if (first == last) { break; } std::iter_swap(first,last); ++first; } return first;}template<class ForwardIt,class UnaryPred> ForwardIt partition(ForwardIt first,ForwardIt last,std::forward_iterator_tag){ first = std::find_if_not(first,last,pred); if (first == last) { return first; } for (ForwardIt src = std::next(first); src != last; ++src) { if (pred(*src)) { std::iter_swap(first,src); ++src; } } return first;}template<class ForwardIt,class UnaryPred>ForwardIt partition(ForwardIt first,UnaryPred pred){ return partition(first,pred,typename std::iterator_traits<ForwardIt>::iterator_category());}解决方法 在两种情况下,谓词pred都执行N次 – 每个元素必须测试一次. ForwardIterator和BIDirectionaliterator之间的区别在于交换量.
BIDirectionaliterator最多可以进行N / 2次交换,因为它一次从前面和后面扫描范围,一旦它从左边达到不满足谓词的值,并且从右边开始实现它,它会交换它们.因此,在最坏的情况下,它可以在N / 2交换中完成它的工作.
ForwardIterator没有这个优势,在最坏的情况下可能会为每个元素进行交换.
该标准要求这两个不同的限制,因为它们都是最好的限制.因此程序员可以依赖每个标准库实现都会这样做.
总结以上是内存溢出为你收集整理的为什么C标准要求std :: partition满足不同类型迭代器的不同复杂性?全部内容,希望文章能够帮你解决为什么C标准要求std :: partition满足不同类型迭代器的不同复杂性?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)