Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

When should I use the new ranged-for and can I combine it with the new cbegin/cend?

The new ranged-for in C++11 will be very concise and useful, of course. As far as I understand how it works, it looks up the "containers" begin and end by trying *Argument-Depending-Lookup" (ADT).

But another addition is that all the containers now have cbegin() and cend() to get the const_iterators for the container.

I am a bit confused, on the one hand I guess I should use cbegin() if I do not want to modify the container, on the other hand I have to add an additional const inside the ranged-for to get the same thing.

So, it looks like this:

// print all
for(const auto elem : data)
  cout << elem

using ADT, finding data.begin(), thus const needed.

vs

// print everything but the first (a reason not to use range-for)
for(auto it = data.cbegin()+1; it!=data.cend(); ++it)
  cout << *it

using data.cbegin(), thus no const needed.

But would this not be more "idiomatic"?:

// 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
  • Did I get the "idiom" right? Any additions?
  • When should I use cbegin?
  • Do I miss something with ranged-for, looking for begin() only?

Edit: correction of error Value vs Iterator

like image 832
towi Avatar asked Apr 28 '11 06:04

towi


1 Answers

cbegin() allows you to get const_iterators from a non-const container without an explicit cast or conversion. If you have a const container then begin() will return a const_iterator anyway.

The new for construct uses begin() because that's the most general, and it avoids too many special cases. Also, by default, the variable is a value, not an iterator or a reference.

std::vector<int> v;
for(auto i: v) // i is an int
    dostuff(i);

This avoids the problem of modifying the container, as the element is copied. To get a reference you need to declare it:

for(auto &i: v)
    dostuff(i);
like image 110
Anthony Williams Avatar answered Oct 31 '22 00:10

Anthony Williams