首页 文章

std :: map :: rend()返回数组的第一个元素,而不是之前的元素

提问于
浏览
3

我正在尝试通过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 回答

  • 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 => 0 .

    这是我的榜样 . 你必须向你的代码展示你实际到达的结果,结果是rend指向第一个元素 .

  • 2

    我相信您缺少的一点是,如果使用调试器检查值, rend()begin() 返回的值将包含相同的值 . 但是,迭代器类型的 operator* 成员仍然可以访问不同的对象 .

    技术细节: rend() 返回的值不能指向 begin() 之前,因为它无效 . 因此决定 rend() 应包含 begin() 的值,并且所有其他反向迭代器将进一步移位一个位置 . operator* 补偿了这一点并且无论如何都要访问正确的元素 .

    24.5.1反向迭代器的第一段说:

    类模板reverse_iterator是一个迭代器适配器,它从其底层迭代器定义的序列的末尾迭代到该序列的开头 . 反向迭代器与其对应的迭代器之间的基本关系由身份 Build :&(reverse_iterator(i))==&(i - 1) .

  • 3

    访问 rend 指向的元素是 undefined behavior . 它很可能会给你容器中的第一个项目或崩溃你的应用程序或任何你能想象的 . 此元素只是一个占位符,用于在迭代时发信号通知容器的末尾(同样适用于各种标准库容器的 end ) .

相关问题