What is the difference between cbegin and begin for vector?

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

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;
}