【问题标题】:Best way to divide an std::vector into N pairs of iterators with the range `Y`将 std::vector 划分为 N 对迭代器的最佳方法,范围为 `Y`
【发布时间】:2013-02-22 16:15:41
【问题描述】:

我有一个 巨大的 向量,我需要在不同的线程中处理它,所以我没有使用相同的数据创建 N 个不同的向量,而是考虑使用迭代器。我已经设法完成了代码,但在我看来它可以缩短或改进。

        Iterator begin = vec.begin();
        Iterator end;
        Iterator endOfVector = vec.end(); 

        while(end != endOfVector){
            end = begin;

            advance(end, elementsPerThread);
            if (end > endOfVector){
                end = endOfVector;
            }

            iteratorPairs.push_back( std::make_pair(begin, end) );

            begin = end;
        }

我已经习惯了 C++/Qt 编程,但是说到 std:: 我觉得我还有很多东西要学。 :)

【问题讨论】:

  • 这对我来说似乎很好(需要注意的是,当您的线程在向量上工作时,您必须非常小心不要使任何迭代器无效!)。你不喜欢它什么?
  • 太冗长了。 :) 类似 `iteatorPairs = split(vec, 8);` 的东西是我一直在寻找的东西。 =p

标签: c++ iterator stdvector


【解决方案1】:

我想我会做一些不同的事情。不是每次都检查我们是否已经通过了向量的末尾,我可能会从计算将要适合的对数开始。只要我们能做到这一点,我们不妨尽可能地适应它们——例如,假设我们每个线程最多有 100 个元素,总共有 550 个元素。按照您的操作方式,我们最终会得到 5 个范围,每个范围 100 个元素,以及一个范围 50 个元素。

如果我们总共有 6 个范围,我们通常宁愿在这 6 个范围上尽可能均匀地分配工作负载,所以我们每个范围使用 550/6 = 91 或 92 个元素(其中一个范围使用一个奇怪的尺寸来弥补差异)。

typedef std::vector<int>::iterator it;   
typedef std::pair<it, it> p;

std::vector<p> split(std::vector<int> const &v, size_t elementsPerThread) {
    std::vector<p> ranges;

    size_t range_count = (v.size()+1) / elementsPerThread+1;
    size_t ePT = v.size() / range_count;

    size_t i;

    it b = v.begin();

    for (i=0; i<v.size()-ePT; i+=ePT)
        ranges.push_back(std::make_pair(b+i, b+i+ePT));

    ranges.push_back(std::make_pair(b+i, v.end()));
    return ranges;
}

【讨论】:

  • 我现在正在考虑迭代器大小的差异,因为在我当前的问题中,每个线程大约有 900 个 itens,而最后一个线程大约有 10 个 itens.. :) 谢谢。你的解决方案非常好。
【解决方案2】:

你的问题是

advance(end, elementsPerThread);

原因是 Advance 会超出向量的末尾,从而导致未定义的行为。我会替换

        advance(end, elementsPerThread);
        if (end > endOfVector){
            end = endOfVector;
        }

advance(end,std::min(elementsPerThread,endOfVector - end));

那么advance不会越过向量的末尾

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 2011-12-15
    • 2014-02-02
    • 2015-01-06
    相关资源
    最近更新 更多