0

我正在尝试通过类型映射反向迭代:

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

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

4

2 回答 2

0

正向迭代器和反向迭代器一一对应。正向迭代器序列有一个“结束后”迭代器 ( end),反向迭代器序列有一个“开始前”迭代器 ( rend)。

由于find返回一个正向迭代器,因此您将正向迭代器转换为其对应的反向迭代器,这不能指向同一个地方,否则“结束后”迭代器将没有对应的内容。

考虑一个包含元素 1-> 0、 2-> 3、 3-> 7、 4->10和 5->的地图15

前向迭代器是 1-> 0、 2-> 3、 3-> 7、 4-> 10、 5-> 15、 6-> end

反向迭代器是: 1-> rend、 2-> 0、 3-> 3、 4-> 7、 5-> 10、 6-> 15

所以前向迭代器10对应的反向迭代器是7。它们都是序列中的第四个迭代器。

于 2013-11-09T06:33:51.027 回答
0

反向迭代器被定义为围绕双向迭代器的适配器。容器的第一个反向迭代器是 reverse_iterator(container.end()) 容器的最后一个反向迭代器是 reverse_iterator(container.begin()) 取消引用持有双向迭代器“当前”的反向迭代器等效于:

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;
}
于 2013-11-09T09:24:49.313 回答