C ++ 98
Я думаю, что нужно учитывать, что утверждение Мейерса относится к c ++ 98. Трудно сказать сегодня, но если я правильно помню
- просто было непросто получить const_iterator для неконстантного контейнера вообще
- если вы получили const_iterator, вы вряд ли могли бы его использовать, поскольку большинство (все?) Аргументов позиции для функций-членов контейнера должны были быть итераторами, а не const_iterators
например.
std::vector<int> container;
потребовалось бы
static_cast<std::vector<int>::const_iterator>(container.begin())
чтобы получить const_iterator, который значительно раздувал бы простой .find
и даже если у вас был результат, то после
std::vector<int>::const_iterator i = std::find(static_cast<std::vector<int>::const_iterator>(container.begin()), static_cast<std::vector<int>::const_iterator>(container.end()),42);
не было бы никакого способа использовать ваш std :: vector :: const_iterator для вставки в вектор или любую другую функцию-член, которая ожидала итераторы для позиции. И не было никакого способа получить итератор от константного итератора. Для этого не было никакого способа литья.
Поскольку const-итератор не означает, что контейнер не может быть изменен, а только то, что указанный элемент не может быть изменен (const-итератор является эквивалентом указателя на const) , который действительно был большим куча дерьма, чтобы иметь дело с такими случаями.
Сегодня верно обратное.
const-итераторы легко получить с помощью cbegin и т. Д. Даже для неконстантных контейнеров и всех (?) Функций-членов, которые занимают позиции, в качестве аргументов используют const-итераторы, поэтому нет необходимости в каком-либо преобразовании.
std::vector<int> container;
auto i = std::find(container.cbegin(), container.cend(), 42);
container.insert(i, 43);
Так, что когда-то было
Предпочитать итераторы, а не const_iterators
сегодня действительно действительно должно быть
Предпочитать const_iterators вместо итераторов
, поскольку первый - просто артефакт исторического дефицита реализации.