【发布时间】:2013-01-09 01:27:01
【问题描述】:
我遇到了一种情况,我必须将一组记录批量处理到数据库中。我想知道如何使用 std 算法来实现这一点。
给定 10002 条记录,我想将其划分为 100 条记录的 bin 进行处理,其余为 2 条的 bin。
希望以下代码能更好地说明我想要完成的工作。我对涉及迭代器、lambda 以及任何现代 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;
}
【问题讨论】:
-
您的限制条件具体是什么? (即我们如何防止这个问题成为一个洗衣清单?)
-
@OliCharlesworth:听起来很直接。给定一个
N元素列表,他希望将其划分为最多Ceiling(N / k)个bin(子列表)的列表,其中k是一个bin 中的最大元素数。对于N % k != 0,这将导致最后一个 bin 包含N % k元素。 -
std 算法,最好不要 if/else 也不要计数器。
-
@MikeBantegui,更加雄辩和简洁的陈述。
-
Zac,你为什么要返回一个向量的向量,而不是 ranges 的向量(其中每个范围都表示为一对迭代器
(from,to)?