Подтвердить что ты не робот

Когда я должен использовать новый диапазон и могу ли я объединить его с новым 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

4b9b3361

Ответ 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, если намерение не изменять элементы в диапазоне. Это очевидная причина их добавления в первую очередь.

Это вряд ли идиоматично, так как новый стандарт даже не от прессов!