Доступ к последнему элементу карты с помощью map.end () - PullRequest
0 голосов
/ 02 октября 2018
#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;
}

Вывод:

3 -1778731776 
3 1

Итераторы указывают на один и тот же ключ, но дают разные значения.Зачем?Я не могу понять это странное поведение.Как здесь работает пост-декремент и пред-декремент?

1 Ответ

0 голосов
/ 02 октября 2018

Итераторы указывают на один и тот же ключ

Нет, они этого не делают.m.end()--; это пост декремент.Его семантика - уменьшить возвращаемое значение m.end() как побочный эффект, но вернуть исходное значение без изменений .Так что it1 == m.end() и вы получите неопределенное поведение, разыменовав его.

Он успешно компилируется из-за нежелательного побочного эффекта operator++, являющегося функцией-членом определенного пользователем типа (итератор).Вы можете вызвать его даже для r-значения, такого как m.end(), в то время как встроенный постдекремент ожидает значение l.

Так что, хотя итераторы указатели модели , они нене совсем то же самое.Для сравнения, эта программа:

char* foo();

int main() {
  foo()--;
}

выдаст ошибку на foo()--, поскольку foo() является указателем r-значения, и мы не можем уменьшить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...