1

我有一个巨大的向量,我需要在不同的线程中处理,所以我没有使用相同的数据创建 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:: 我觉得我还有很多东西要学。:)

4

2 回答 2

3

我想我会做一些不同的事情。不是每次都检查我们是否已经通过了向量的末尾,我可能会从计算将要适合的对数开始。只要我们能做到这一点,我们不妨尽可能地适应它们——例如,假设我们每个线程最多有 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;
}
于 2013-02-22T17:06:15.843 回答
0

你遇到的问题是

advance(end, elementsPerThread);

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

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

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

然后Advance不会超过向量的末尾

于 2013-02-22T17:02:19.417 回答