Новый диапазон в С++ 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