Reputation: 7367
The member begin has two overloadings one of them is const_iterator begin() const;
. There's also the cbegin const_iterator cbegin() const noexcept;
. Both of them returns const_iterator
to the begin of a list. What's the difference?
Upvotes: 100
Views: 54185
Reputation: 567
begin()
returns an iterator
to beginning while cbegin()
returns a const_iterator
to beginning.
The basic difference between these two is iterator
(i.e begin()
) lets you change the value of the object it is pointing to and const_iterator
will not let you change the value of the object.
For example:
This IS allowed. The vector values change to {0,10,20,30,40}
:
vector<int> v{10,20,30,40,50};
vector<int> :: iterator it;
for (it = v.begin(); it != v.end(); it++)
{
*it = *it - 10;
}
This is NOT allowed. It will throw an error:
for (it = v.cbegin(); it != v.cend(); it++)
{
*it = *it - 10;
}
Upvotes: 40
Reputation: 65720
begin
will return an iterator
or a const_iterator
depending on the const-qualification of the object it is called on.
cbegin
will return a const_iterator
unconditionally.
std::vector<int> vec;
const std::vector<int> const_vec;
vec.begin(); //iterator
vec.cbegin(); //const_iterator
const_vec.begin(); //const_iterator
const_vec.cbegin(); //const_iterator
Upvotes: 136