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