反向迭代器指向错误的点

时间:2013-11-09 06:22:34

标签: c++ iterator

我正在尝试反向迭代类型的地图:

0 3 7 10 15

我需要从10回到开始反向迭代这个地图:

for(map<unsigned int, Object*>::reverse_iterator rit(mapA.find(10)); rit != mapA.rend(); ++rit) {
    cout << rit->first << endl;
}

但是,我得到了以下内容:

7 3 0

我可以知道这次迭代有什么问题吗?

2 个答案:

答案 0 :(得分:0)

前向迭代器和反向迭代器一一对应。 forward迭代器序列有一个“after the end”迭代器(end),反向迭代器序列有一个“在开头之前”迭代器(rend)。

由于find返回一个正向迭代器,你将正向迭代器转换为相应的反向迭代器,这不能指向同一个地方,因为否则“结束之后”迭代器将没有任何东西可以对应。 / p>

考虑包含元素1-&gt; 0,2-&gt; 3,3-&gt; 7,4-&gt; 10和5的地图 - &GT; 15

前向迭代器是1-&gt; 0,2-&gt; 3,3-&gt; 7,4-&gt; 10,5-&gt; ; 15,6-&gt; end

反向迭代器是:1-&gt; rend,2-&gt; 0,3-&gt; 3,4-&gt; 7,5- &gt; 10,6-&gt; 15

因此对应于forward iterator 10的反向迭代器是7.它们都是序列中的第四个迭代器。

答案 1 :(得分:0)

反向迭代器被定义为双向迭代器周围的适配器。 容器的第一个反向迭代器是reverse_iterator(container.end()) 容器的最后一个反向迭代器是reverse_iterator(container.begin()) 解除引用双向迭代器'current'的反向迭代器 相当于:

deref_tmp = current;
--deref_tmp;
return *deref_tmp;

因此(在这里使用一套):

int main() {
    typedef std::set<int> Set;
    Set set = { 0, 3, 7, 10, 15 };
    Set::const_iterator forward = set.find(10);
    if(forward != set.end()) {
        for(Set::const_reverse_iterator backward = Set::const_reverse_iterator(++forward);
            backward != set.rend();
            ++backward)
        std::cout << *backward << ' ';
    }
    std::cout << std::endl;
    return 0;
}