Я изучаю библиотеку последовательных контейнеров, и кое-что заставило меня задуматься.
Я считал само собой разумеющимся, что каждый контейнер, кроме особых случаев, таких как forward_list, где это невозможно в одном направлении, полностью поддерживает итераторарифметика.Вместо этого я только что обнаружил, что универсальный контейнер поддерживает только очень специфический набор операций: * и -> (по понятным причинам), пре- и пост-инкремент и декремент (не уверены на 100% относительно post) и реляционные операторы равенства / неравенства.Более сложная арифметика зарезервирована для векторов, строк и deque.
Я не понимаю этого ограничения.По каким причинам нам запрещено, например, вычитать между двумя итераторами или добавлять int к итератору?В конце концов, если у нас есть доступ к пре / постинкременту / декременту, мы можем легко, хотя и неэффективно, реализовать сложение и вычитание, многократно повторяя эти операции с целочисленным счетчиком.