Итераторы std::multimap и std::deque
Подскажите пожалуйста, почему у std::deque - к итератору можно прибавлять "шаг", а к std::multimap не получается ?
#include <iostream>
#include <deque>
#include <map>
int main()
{
std::deque<int>my_deq;
std::deque<int>::iterator iterator_deq;
iterator_deq = my_deq.begin() + 1;
std::multimap<std::string, int>my_multimap;
std::multimap<std::string, int>::iterator iterator;
iterator = my_multimap.begin() + 1; //Так нельзя, VS2019 выдает ошибку.
}
Ответы (1 шт):
Потому что существует куча разных итераторов (как минимум штук пять). и хотя они все похожи, но нет. Они внутри чуточку разные. У мапы вот такой - https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator (посмотрите на список операций, которые он поддерживает).
Отвечая на вопрос - да, итаратор у мапы не поддерживает такую операцию, но можно вот так
iterator = my_multimap.begin();
iterator++;
или так
iterator = std::next(my_multimap.begin());
или даже так
iterator = std::next(my_multimap.begin(),1);
что эквивалентно предыдущему и тому, что хочется.
Почему так сложно? да просто видимо для мапы операция "прибавить число к итератору" не такая тривиальная операция (нужно поэлементно пройтись, но это зависит от реализации внутри, может кто то сделает и наоборот), вот и сделали явно, что бы программист понимал, что он делает. А вот для вектора или деки это очень легкая операция и там можно оставить "простой интерфейс" - у него random access iterator