首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将向量分割成n个“几乎相等”的部分

如何将向量分割成n个“几乎相等”的部分
EN

Stack Overflow用户
提问于 2011-07-28 14:57:14
回答 8查看 19K关注 0票数 19

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

我对此的解决方案是将任务拆分为较小的子任务,运行它们,并完成将它们组合在一起的最终任务。

我的想法是写一个函数,它接受图像和整数的向量,然后把向量分解成n个子向量,所有子向量都有“几乎相等”的部分。

例如,如果我想把11分成3组,它是4-4-3组。

你能告诉我在C++怎么做吗?我是说,写一个函数

代码语言:javascript
复制
split_vec( const vector<image> &images, int split )

分裂是哪一种?

另外,如果我不需要创建新的向量,只需遍历子部分,那么您能告诉我做最有效的方法是什么吗?就像std::substr函数和std::string一样

注意:我已经在这个项目中使用了Boost,所以如果在Boost中有一些很好的工具,那么它非常适合我。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-07-28 15:03:54

要得到每个零件大小的基数,只需将总数除以零件数: 11/3 = 3。很明显,有些零件需要比这个更大才能得到适当的总数,但这只是剩余的: 11 % 3 = 2。所以现在你知道其中两个部件的大小是3+1,剩下的部分是3。

票数 14
EN

Stack Overflow用户

发布于 2016-06-08 16:53:09

这是我的解决方案:

代码语言:javascript
复制
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;
}
票数 7
EN

Stack Overflow用户

发布于 2011-07-28 15:04:43

CreateProcess有一个32 has的限制

或者,如果你想通过贝壳,

代码语言:javascript
复制
vec::const_iterator i = vec .begin ();
vec::const_iterator j = i + stride;

while (j < vec .end ()) {
    do_range (i, j);
    i = j;
    j += stride;
}

do_range (i, vec .end ());
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6861089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档