大佬教程收集整理的这篇文章主要介绍了c – 使用std算法将容器分区/批处理/块化为相等大小的块,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
给定10002条记录,我希望将其分成100个记录的区间进行处理,其余为2的区间.
希望下面的代码能更好地说明我想要完成的任务.我完全愿意接受迭代器的解决方案,lambdas任何现代的C语言乐趣.
#include <Cassert> #include <vector> #include <algorithm> template< typename T > std::vector< std::vector< T > > chunk( std::vector<T> const& container,size_t chunk_size ) { return std::vector< std::vector< T > >(); } int main() { int i = 0; const size_t test_size = 11; std::vector<int> container(test_sizE); std::generate_n( std::begin(container),test_size,[&i](){ return ++i; } ); auto chunks = chunk( container,3 ); assert( chunks.size() == 4 && "should be four chunks" ); assert( chunks[0].size() == 3 && "first several chunks should have the ideal chunk size" ); assert( chunks.BACk().size() == 2 && "last chunk should have the remaining 2 elements" ); return 0; }
这就是我想出来的……
// (Headers omitted) template < typename Iterator > void for_each_interval( Iterator begin,Iterator end,size_t interval_size,std::function<void( Iterator,Iterator )> operation ) { auto to = begin; while ( to != end ) { auto from = to; auto counter = interval_size; while ( counter > 0 && to != end ) { ++to; --counter; } operation( from,to ); } }
(我希望std :: advance会处理使用COunter递增的内部循环,但不幸的是它盲目地超越了结尾[我很想写我自己的smart_advance模板来封装它].如果这样可行的话,它会减少大约一半的代码量!)
现在为一些代码来测试它…
// (Headers omitted) int main( int argc,char* argv[] ) { // Some test data int foo[10] = { 0,1,2,3,4,5,6,7,8,9 }; std::vector<int> my_data( foo,foo + 10 ); size_t const interval = 3; typedef decltype( my_data.begin() ) iter_t; for_each_interval<iter_t>( my_data.begin(),my_data.end(),interval,[]( iter_t from,iter_t to ) { std::cout << "Interval:"; std::for_each( from,to,[&]( int val ) { std::cout << " " << val; } ); std::cout << std::endl; } ); }
这会产生以下输出,我认为它代表你想要的:
Interval: 0 1 2 Interval: 3 4 5 Interval: 6 7 8 Interval: 9
以上是大佬教程为你收集整理的c – 使用std算法将容器分区/批处理/块化为相等大小的块全部内容,希望文章能够帮你解决c – 使用std算法将容器分区/批处理/块化为相等大小的块所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。