使用map.end()访问地图的最后一个元素

Vik*_*hee 1 c++ stl

#include<bits/stdc++.h>
using namespace std;

int main()
{
    map <int, int > m;
    map <int, int>::iterator it1, it2;
    m[1] = 1;
    m[2] = 1;
    m[3] = 1;
    it1 = m.end()--;
    it2 = --m.end();

    cout << it1->first << " " << it1->second << endl;
    cout << it2->first << " " << it2->second << endl;
}
Run Code Online (Sandbox Code Playgroud)

输出:

3 -1778731776 
3 1
Run Code Online (Sandbox Code Playgroud)

迭代器指向相同的键,但给出不同的值.为什么?我无法理解这种奇怪的行为.后减量和预减量如何在这里起作用?

Sto*_*ica 7

迭代器指向同一个键

不,他们没有.m.end()--;是减少后.它的语义是减少m.end()作为副作用的返回值,但返回原始值不变.因此it1 == m.end(),您通过解除引用来获得未定义的行为.

由于operator++作为用户定义类型(迭代器)的成员函数的不幸副作用,它成功编译.您甚至可以在r值上调用它m.end(),而内置的后递减期望l值.

因此即使迭代器模型指针,它们也不完全相同.相比之下,这个程序:

char* foo();

int main() {
  foo()--;
}
Run Code Online (Sandbox Code Playgroud)

会产生错误foo()--,因为foo()是一个r值指针,我们不能减少它.