c – count_until和accumulate_until的实现?
发布时间:2020-12-16 07:53:21 所属栏目:百科 来源:网络整理
导读:给定输入序列,标准算法std :: count和std :: accumulate计算特定值(或std :: count_if的谓词匹配)的发生次数和给定关联操作的累加(sum,product,Boolean或/和,最小/最大,字符串连接等). 如果想知道输入序列是否包含精确/至少/最多n个出现/匹配,或者累加到一个
给定输入序列,标准算法std :: count和std :: accumulate计算特定值(或std :: count_if的谓词匹配)的发生次数和给定关联操作的累加(sum,product,Boolean或/和,最小/最大,字符串连接等).
如果想知道输入序列是否包含精确/至少/最多n个出现/匹配,或者累加到一个/至少/至多n个的总和,该怎么办?强力的方法是将std :: count或std :: accumulate的结果与目标n进行比较,但是当计数或累积超过目标已经在输入序列的一半时,会错过早期退出机会. 例如,做一个count_until as template<class InputIt,class T,class Pred> auto count_until(InputIt first,InputIt last,const T& value,Pred pred) { auto res = 0; for (; first != last; ++first) if (*first == value && pred(++res)) break; // early exit if predicate is satisfied return std::make_pair(first,res); // iterator and value to allow continuation } 并且可以通过使用合适的谓词和与返回的计数进行比较来测试平等/至少/最多. 问题: >是否可以使用现有的标准算法来组合count_until(和accumulate_until类似),可能与合适的Boost.Iterator结合使用? 编辑:我认为最有用的方法是返回一个迭代器的std ::对,并且在谓词首先满足的点处的计数.这使用户能够继续迭代. 解决方法
我正在考虑std :: find_if与状态谓词的组合:
(Pred是普通用户谓词) template<class InputIt,class Pred> typename iterator_traits<InputIterator>::difference_type count_until(InputIt begin,InputIt end,Pred pred) { typename iterator_traits<InputIterator>::difference_type count = 0; auto internal_pred = [&count,&value,&pred](decltype(*begin) elem) { return elem == value && pred(++count); }; std::find_if(begin,end,internal_pred); return count; } template<class InputIt,class Pred> T accumulate_until(InputIt begin,T value,Pred pred) { auto internal_pred = [&value,&pred] (const T& t) { value += t; return pred(value); }; std::find_if(begin,internal_pred); return value; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |