Ответ 1
Стандарт С++ 14 (N3936) гарантирует, что iterator
и const_iterator
свободно сопоставимы (§23.2.1 [container.requirements.general]/p7):
В выражениях
i == j i != j i < j i <= j i >= j i > j i - j
где
i
иj
обозначают объекты типа контейнераiterator
один или оба могут быть заменены объектом контейнеровconst_iterator
, ссылаясь на тот же элемент без изменений в семантика.
Кроме того, функции-члены контейнера принимают const_iterator
параметры как из С++ 11 (§C.2.13 [diff.cpp03.containers] - как это можно сделать из тега, это изменение из С++ 03):
Изменить: изменения подписи: от
iterator
доconst_iterator
параметровОбоснование: Overspecification. Эффекты: сигнатуры следующих функций-членов изменились с принятия
iterator
на принятие aconst_iterator
:
insert(iter, val)
дляvector
,deque
,list
,set
,multiset
,map
,multimap
insert(pos, beg, end)
дляvector
,deque
,list
,forward_list
erase(iter) for
набор,
мультимножеством,
карта,
multimap`erase(begin, end) for
набор,
мультимножеством,
карта,
multimap`- все формы
list::splice
- все формы
list::merge
Требования к контейнеру были аналогичным образом изменены для принятия итераторов const. Кроме того, легко получить базовый итератор от a std::reverse_iterator
через его функцию-член .base()
. Таким образом, ни одна из проблем, отмеченных в вопросе, не должна быть проблемой в соответствующем компиляторе.