Новый диапазон в С++ 11 будет очень кратким и полезным, конечно. Насколько я понимаю, как это работает, он просматривает "контейнеры" begin и end, используя * Аргумент-зависимый поиск (ADT).
Но еще одно дополнение - все контейнеры теперь имеют cbegin() и cend(), чтобы получить const_iterators для контейнера.
Я немного смущен, с одной стороны, я думаю, я должен использовать cbegin(), если я не хочу изменять контейнер, с другой стороны, мне нужно добавить дополнительный const внутри диапазона для получить то же самое.
Итак, это выглядит так:
// print all
for(const auto elem : data)
cout << elem
с использованием ADT, нахождение data.begin(), поэтому const необходимо.
против
// print everything but the first (a reason not to use range-for)
for(auto it = data.cbegin()+1; it!=data.cend(); ++it)
cout << *it
используя data.cbegin(), поэтому не требуется const.
Но разве это не было бы более "идиоматическим"?:
// print everything but the first (a reason not to use range-for)
for(const auto it = data.begin()+1; it!=data.end(); ++it)
cout << *it
- Правильно ли я получил "идиому"? Любые дополнения?
- Когда следует использовать
cbegin? - Я что-то пропустил с помощью диапазона, ища только
begin()?
Изменить: исправление ошибки Значение vs Iterator