#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)
迭代器指向相同的键,但给出不同的值.为什么?我无法理解这种奇怪的行为.后减量和预减量如何在这里起作用?
迭代器指向同一个键
不,他们没有.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值指针,我们不能减少它.