#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;
}
Output:
3 -1778731776
3 1
The iterators are pointing to the same key but are giving different values. Why? I am unable to understand this odd behaviour. How does the post-decrement and the pre-decrement work here?
答案 0 :(得分:7)
迭代器指向同一个键
不,他们没有。 m.end()--;
是递减。它的语义是减少m.end()
的返回值作为副作用,但返回原始值。因此,it1 == m.end()
可以通过取消引用来获得不确定的行为。
由于operator++
的不幸副作用是用户定义类型的成员函数(迭代器),因此编译成功。您甚至可以在m.end()
之类的r值上调用它,而内置的后减量则需要一个l值。
因此,即使迭代器模型指针,它们也不尽相同。与此相反,此程序:
char* foo();
int main() {
foo()--;
}
will produce an error on foo()--
,因为foo()
是一个r值指针,我们不能将其递减。