Уменьшение конца 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;
Я не знаю, почему я получаю эту ошибку, поскольку я считаю, что арифметические операции разрешены во всех типах итераторов.
Ответы
Ответ 1
Не все категории итераторов поддерживают арифметические операции, что заблуждение. Если вы хотите написать более общий код, вы можете использовать std::prev
:
it = std::prev(myMap.end());
Он ожидает двунаправленный итератор, который имеет итератор std::map
. Если вы хотите переместить итератор более чем на один шаг, он также может принять второй параметр, обозначающий, как далеко перемещать итератор.
Кроме того, когда вы передаете ему итератор с произвольным доступом, он будет таким же быстрым, как и арифметика.
Ответ 2
Я рекомендую вам прочитать о различных категориях итератора и узнать, какие операции доступны для них.
Более конкретно std::map
итератор двунаправленный итератор, который не имеет двоичного вычитания.