Почему я не могу использовать `+ 1` в итераторе` map` в c ++? - PullRequest
3 голосов
/ 11 ноября 2019

У меня проблема с использованием итератора в map. У меня есть карта с типом map<int, vector<int> > vpmap;. Я хочу просмотреть всю карту. Тогда я использую

 for (size_t i = 0; i < vpmap.size(); i++) {
    {
        auto it = vpmap.begin();
        it++;
        /*code*/
    }

Это хорошо. Но когда я заменяю it++ на it=it+1. Компилятор выдает ошибку. Я не получал эту ошибку раньше при использовании vector. Я хотел бы знать причину этого.

Ответы [ 2 ]

6 голосов
/ 11 ноября 2019

std::vector::iterator является LegacyRandomAccessIterator . Требуется поддерживать операцию it + 1.

. С другой стороны, std::map::iterator является LegacyBidirectionalIterator . Не требуется поддержка it + 1, но требуется поддержка it++, а также it--.

Соответствующая информация из ответа на другой пост :

Причиной этого является то, что добавление N к итератору произвольного доступа является постоянным временем (например, добавление N*sizeof(T) к T*), тогда как для двунаправленного итератора выполнение того же действия потребует применения ++ N раз.

5 голосов
/ 11 ноября 2019

it - это итератор std::map, это двунаправленный итератор и не поддерживает operator+.

RandomAccess Iterator поддерживает operator+, например, итератор std::vector, поэтому вы не получили эту ошибку с std::vector.

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