我正在尝试通过类型映射反向迭代:
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
我可以知道这个迭代有什么问题吗?
正向迭代器和反向迭代器一一对应。正向迭代器序列有一个“结束后”迭代器 ( 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。它们都是序列中的第四个迭代器。
反向迭代器被定义为围绕双向迭代器的适配器。容器的第一个反向迭代器是 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;
}