c – 使用std算法将容器分区批处理块化为相等大小的块

c – 使用std算法将容器分区批处理块化为相等大小的块,第1张

概述我遇到了一种情况,我不得不将一组记录批处理到数据库.我想知道如何使用std算法实现这一目标. 给定10002条记录,我希望将其分成100个记录的区间进行处理,其余为2的区间. 希望下面的代码能更好地说明我想要完成的任务.我完全愿意接受迭代器的解决方案,lambdas任何现代的C语言乐趣. #include <cassert>#include <vector>#include <algorith 我遇到了一种情况,我不得不将一组记录批处理到数据库.我想知道如何使用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;}
解决方法 这个问题似乎是std :: for_each的一个变种,你想要 *** 作的“每个”是你的集合的间隔.因此,您更愿意编写一个lambda(或函数),它接受两个迭代器定义每个间隔的开始和结束,并将该lambda /函数传递给您的算法.

这就是我想出来的……

// (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 2Interval: 3 4 5Interval: 6 7 8Interval: 9
总结

以上是内存溢出为你收集整理的c – 使用std算法将容器分区/批处理/块化为相等大小的块全部内容,希望文章能够帮你解决c – 使用std算法将容器分区/批处理/块化为相等大小的块所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1242237.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存