随后在多个std容器上迭代

时间:2015-06-08 11:53:58

标签: c++ std stdvector

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

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()

3 个答案:

答案 0 :(得分:4)

基本上你需要定义一些自定义迭代器,它在内部检查第一个范围的结束,然后继续下一个。

然而,这种事情发生了很多。最后你会问为什么是两个向量的迭代器,为什么是两个向量的迭代器,为什么是相同容器类型的序列,等等。 Nir Tzachar&amp;我写了一个C++ port of Python itertools来做这种常见的事情。在这种情况下,您只需使用

chain(firstVector, secondVector)

可以从this bitbucket repo下载。

答案 1 :(得分:2)

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

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;
}

我将把剩下的操作留作练习。

答案 2 :(得分:-2)

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

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

这也是对其他人的一个很好的指示,即增量不会正常发生。