随后迭代多个标准容器

iterator over multiple std containers subsequently

我有以下 class(显然还没有按预期工作):

class A
{
private:
    std::vector<int> firstVector, secondVector;
public:
    std::vector<int>::iterator begin(){
        return firstVector.begin();
    }
    std::vector<int>::iterator end(){
        return secondVector.end();
    }
};

我如何定义一个迭代器,它随后将遍历两个成员容器,例如在返回 firstVector.end()-1 secondVector.begin() 并一直到 secondVector.end() ?

基本上,您需要定义一些自定义迭代器,在内部检查第一个范围的末尾,然后继续到下一个范围。

不过,这种事情经常发生。最终你会问为什么迭代器用于 two vectors,为什么迭代器用于两个 vectors,为什么序列具有相同的容器类型,等等在。 Nir Tzachar 和我写了一个 C++ port of Python itertools 来做这种常见的事情。在这种情况下,您只需使用

chain(firstVector, secondVector)

可以从this bitbucket repo下载。

您可以编写自己的函数来进行递增:

std::vector<int>::iterator& inc(std::vector<int>::iterator& it) {
    ++it;
    if (it == firstVector.end())
        it = secondVector.begin();
    return it;
}

这也很好地向其他人表明增量不会正常发生。

没有什么能阻止你自己动手。甚至可以让它随机访问!

struct chain_iterator 
    : std::iterator<std::random_access_iterator_tag, int>
{
    using it = std::vector<int>::iterator;

    std::pair<it, it> v1, v2;
    bool first;
    it cur;
};

我们保留初始迭代器对,以便我们可以正确地进行随机访问。

增加是你所期望的:

chain_iterator& operator++() {
    ++cur;
    if (first && cur == v1.second) {
        first = false;
        cur = v2.first;
    }
    return *this;
}

解引用很简单:

int& operator*() { return *cur; }

Advance 需要做一些额外的检查:

chain_iterator& operator+=(size_t n) {
    if (!first) {
        // trivial case
        cur += n;
    }
    else {
        size_t d = v1.second - cur;
        if (d < n) {
            cur += n;
        }
        else {
            first = false;
            cur = v2.first + (d - n);
        }
    }
    return *this;
}

我将把其余的操作留作练习。