我正在尝试反向迭代类型的地图:
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
我可以知道这次迭代有什么问题吗?
答案 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;
}