Accessing last element of map using map.end()

时间:2018-10-02 09:20:29

标签: 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;
}

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?

1 个答案:

答案 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值指针,我们不能将其递减。