Подтвердить что ты не робот

Уменьшение конца std:: map

Вот мой код:

#include <iostream>
#include <map>
using namespace std;

int main() {
    map<int , int > myMap;

    map<int , int>::iterator it;

    myMap.insert(pair<int , int>(1,2));
    myMap.insert(pair<int , int>(671,223));
    myMap.insert(pair<int , int>(353,245352));

    it = myMap.end() - 1;

    cout << it->first << it->second << endl;

    return 0;
}

Компиляция этого кода приводит к следующей ошибке компиляции:

error: no match for ‘operator-’ (operand types are ‘std::map<int, int>::iterator {aka std::_Rb_tree_iterator<std::pair<const int, int> >}’ and ‘int’)
  it = myMap.end() - 1;

Я не знаю, почему я получаю эту ошибку, поскольку я считаю, что арифметические операции разрешены во всех типах итераторов.

4b9b3361

Ответ 1

Не все категории итераторов поддерживают арифметические операции, что заблуждение. Если вы хотите написать более общий код, вы можете использовать std::prev:

it = std::prev(myMap.end());

Он ожидает двунаправленный итератор, который имеет итератор std::map. Если вы хотите переместить итератор более чем на один шаг, он также может принять второй параметр, обозначающий, как далеко перемещать итератор.

Кроме того, когда вы передаете ему итератор с произвольным доступом, он будет таким же быстрым, как и арифметика.

Ответ 2

Я рекомендую вам прочитать о различных категориях итератора и узнать, какие операции доступны для них.

Более конкретно std::map итератор двунаправленный итератор, который не имеет двоичного вычитания.