我正在尝试按照以下代码反向遍历std :: map:http://www.cplusplus.com/reference/stl/map/rend/ 它说:
rend()返回一个反向迭代器,引用地图容器中第一个元素之前的元素,它被视为反向结束。
请注意,rend不会引用与begin相同的元素,而是引用它之前的元素。
map<float,int> m;
m.insert(pair<float,int>(.1,0));
m.insert(pair<float,int>(.4,5));
map<float,int>::reverse_iterator rend=m.rend();
map<float,int>::iterator begin=m.begin();
当我运行它时,rend和begin都指向m的第一个元素(.1,0),显然它不应该,如上面的注释。我觉得我正在制造一些非常明显的错误,但我无法弄清楚它可能是什么。
(C ++,MSVC2010)
答案 0 :(得分:3)
我相信您缺少的是,如果您使用调试器检查值,rend()
和begin()
返回的值将包含相同的值。但是,迭代器类型的operator*
成员仍然可以访问不同的对象。
技术详细信息:rend()
返回的值无法指向begin()
之前,因为它无效。因此决定rend()
应该包含begin()
的值,并且所有其他反向迭代器将进一步移位一个位置。 operator*
会对此进行补偿,并且无论如何都会访问正确的元素。
24.5.1反向迭代器的第一段说:
类模板reverse_iterator是一个迭代器适配器,它从其底层迭代器定义的序列的末尾迭代到该序列的开头。反向迭代器与其对应的迭代器之间的基本关系由身份建立:
&*(reverse_iterator(i)) == &*(i - 1)
。
答案 1 :(得分:2)
访问rend
指向的元素未定义的行为。它很可能会给你容器中的第一个项目或崩溃你的应用程序或任何你能想象的。此元素只是一个占位符,用于在迭代时发信号通知容器的末尾(同样适用于各种标准库容器的end
)。
答案 2 :(得分:2)
我不确定你是如何检查rend
指向的位置的,但我运行此示例反驳了您的声明。
int main() {
map<float,int> m;
m.insert(pair<float,int>(.1,0));
m.insert(pair<float,int>(.4,5));
map<float,int>::reverse_iterator rend=m.rend();
map<float,int>::iterator begin=m.begin();
for ( rend=m.rbegin() ; rend != m.rend(); rend++ )
cout << rend->first << " => " << rend->second << endl;
}
输出:
0.4 => 5
0.1 => 0
如果rend
指向第一个元素,则0.1 =&gt; 0将不会被打印。
这是我的榜样。你必须向你的代码展示你实际到达的结果,结果是rend指向第一个元素。