Подтвердить что ты не робот

В чем разница между cbegin и begin for vector?

Элемент begin имеет две перегрузки, один из которых - const_iterator begin() const;. Там также cbegin const_iterator cbegin() const noexcept;. Оба они возвращают const_iterator в начало списка. Какая разница?

4b9b3361

Ответ 1

begin будет возвращать iterator или const_iterator в зависимости от const-квалификации объекта, на который он вызывается.

cbegin будет безоговорочно возвращать const_iterator.

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

Ответ 2

begin() возвращает итератор в начало, а cbegin() возвращает const_iterator в начало. Основное различие между ними заключается в итераторе (то есть begin()), позволяющем изменить значение объекта, на который он указывает, а const_iterator не позволит вам изменить значение объекта.

Например:

vector<int> v{10,20,30,40,50};
vector<int> :: iterator it;

for(it = v.begin(); it != v.end(); it++)
{
*it = *it - 10;
}

Это разрешено. Значения вектора изменяются на {0,10,20,30,40}

for(it = v.cbegin();it != v.cend();it++)
{
 *it = *it -10;
}

Это запрещено. Это выдаст ошибку.