如何将矢量分成n个"几乎相等"的部分

hyp*_*not 16 c++ boost iterator vector visual-studio-2010

我有一个问题,我想使用ImageMagick的convert.exe合并大量的图像,但在Windows下我有一个8192字节长的命令行限制.

我的解决方案是将任务拆分为更小的子任务,运行它们,并执行将它们组合在一起的最终任务.

我的想法是编写一个函数,它接受一个图像矢量和一个整数,并将矢量分成n个子矢量,所有子矢量都具有"几乎相等"的部分.

因此,例如,如果我想将11分成3组,那么它将是4-4-3.

你能告诉我怎么用C++做的吗?我的意思是,写一个函数

split_vec( const vector<image> &images, int split )
Run Code Online (Sandbox Code Playgroud)

哪个分裂?

另外,如果我不需要创建新的向量,只是遍历子部分,你能告诉我最有效的方法吗?喜欢的std::substr功能有std::string

注意:我已经在项目中使用了Boost,所以如果在Boost中有一些不错的工具,那么它对我来说是完美的.

Mar*_*som 11

要获得每个零件尺寸的基数,只需将总数除以零件数量:11/3 = 3.显然,某些零件需要大于那个才能得到合适的零件,但这只是余数:11%3 = 2.所以现在你知道其中2个部分的大小为3 + 1,剩下的任何部分都是3.


Yur*_*ury 6

这是我的解决方案:

template<typename T>
std::vector<std::vector<T>> SplitVector(const std::vector<T>& vec, size_t n)
{
    std::vector<std::vector<T>> outVec;

    size_t length = vec.size() / n;
    size_t remain = vec.size() % n;

    size_t begin = 0;
    size_t end = 0;

    for (size_t i = 0; i < std::min(n, vec.size()); ++i)
    {
        end += (remain > 0) ? (length + !!(remain--)) : length;

        outVec.push_back(std::vector<T>(vec.begin() + begin, vec.begin() + end));

        begin = end;
    }

    return outVec;
}
Run Code Online (Sandbox Code Playgroud)