Когда я должен использовать новый дальний бой и могу ли я объединить его с новым cbegin / cend? - PullRequest
14 голосов
/ 28 апреля 2011

Новый ранжированный в C ++ 11, конечно, будет очень лаконичным и полезным.Насколько я понимаю, как это работает, он ищет «контейнеры» begin и end, пытаясь * Argument-Based-Lookup (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()?

Редактировать: Исправление ошибки Значениепротив итератора

Ответы [ 2 ]

14 голосов
/ 28 апреля 2011

cbegin() позволяет вам получить const_iterator s из не 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);
0 голосов
/ 28 апреля 2011

Я бы использовал cbegin / cend in в цикле for, если не намерен изменять элементы в диапазоне. Это очевидная причина их добавления.

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

...