我正在尝试通过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)
3 回答
我不确定你是如何检查
rend
指向的位置,但是我运行这个例子反驳了你的主张 .输出:
如果
rend
指向第一个元素,则不会打印0.1 => 0 .这是我的榜样 . 你必须向你的代码展示你实际到达的结果,结果是rend指向第一个元素 .
我相信您缺少的一点是,如果使用调试器检查值,
rend()
和begin()
返回的值将包含相同的值 . 但是,迭代器类型的operator*
成员仍然可以访问不同的对象 .技术细节:
rend()
返回的值不能指向begin()
之前,因为它无效 . 因此决定rend()
应包含begin()
的值,并且所有其他反向迭代器将进一步移位一个位置 .operator*
补偿了这一点并且无论如何都要访问正确的元素 .24.5.1反向迭代器的第一段说:
访问
rend
指向的元素是 undefined behavior . 它很可能会给你容器中的第一个项目或崩溃你的应用程序或任何你能想象的 . 此元素只是一个占位符,用于在迭代时发信号通知容器的末尾(同样适用于各种标准库容器的end
) .