Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 多个std容器上的迭代器_C++_Std_Stdvector - Fatal编程技术网

C++ 多个std容器上的迭代器

C++ 多个std容器上的迭代器,c++,std,stdvector,C++,Std,Stdvector,我有以下课程(显然还没有达到预期的效果): A类 { 私人: std::向量第一向量,第二向量; 公众: std::vector::迭代器begin(){ 返回firstVector.begin(); } std::vector::迭代器end(){ 返回secondVector.end(); } }; 我如何定义一个迭代器,该迭代器将随后遍历两个成员容器,例如在firstVector.end()-1secondVector.begin()返回并一直运行到secondVector.end()?

我有以下课程(显然还没有达到预期的效果):

A类
{
私人:
std::向量第一向量,第二向量;
公众:
std::vector::迭代器begin(){
返回firstVector.begin();
}
std::vector::迭代器end(){
返回secondVector.end();
}
};

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

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

然而,这种事情经常发生。最后,您会问为什么两个向量使用迭代器,为什么两个向量使用迭代器,为什么使用相同容器类型的序列,等等。Nir Tzachar&我写了一篇文章,写了这种常见的东西。在这种情况下,您只需使用

chain(firstVector, secondVector)

可以从下载。

您可以编写自己的函数来执行递增操作:

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

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

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

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;
};
取消引用是微不足道的:

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;
}
链迭代器和运算符+=(大小){
如果(!第一个){
//琐事
cur+=n;
}
否则{
大小\u t d=v1.2秒-电流;
if(d

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

迭代器也是一种普通的类类型,所以可以自己编写。您还可以查看Boost.Iterator,这是一个用于方便编写迭代器的实用程序库。您需要定义一个自定义的
迭代器
。如何使C指针做到这一点?迭代器只是用更多的保护和方法来包装它。您需要自己实现ti,例如,当迭代器==firstvector.end跳转到secondVector.begin()时,这个问题非常类似,但由于这是一个只有两个范围要链接的特殊情况,因此答案至少可能不同。“增量不会正常发生”--通常的随机访问迭代器操作,如

int& operator*() { return *cur; }
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;
}