Когда я должен использовать новый диапазон и могу ли я объединить его с новым cbegin/cend?
Новый диапазон в С++ 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
Ответы
Ответ 1
cbegin()
позволяет получить const_iterator
из контейнера не const
без явного перевода или преобразования. Если у вас есть контейнер const
, тогда begin()
будет возвращать const_iterator
.
В новой конструкции for
используется begin()
, потому что это наиболее общее, и это позволяет избежать слишком многих особых случаев. Кроме того, по умолчанию переменная имеет значение , а не итератор или ссылку.
std::vector<int> v;
for(auto i: v) // i is an int
dostuff(i);
Это позволяет избежать проблемы изменения контейнера при копировании элемента. Чтобы получить ссылку, вам необходимо объявить ее:
for(auto &i: v)
dostuff(i);
Ответ 2
Я бы использовал cbegin/cend in в цикле for
, если намерение не изменять элементы в диапазоне. Это очевидная причина их добавления в первую очередь.
Это вряд ли идиоматично, так как новый стандарт даже не от прессов!