Элемент begin имеет две перегрузки, один из которых - const_iterator begin() const;
. Там также cbegin const_iterator cbegin() const noexcept;
. Оба они возвращают const_iterator
в начало списка. Какая разница?
В чем разница между cbegin и begin for vector?
Ответ 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;
}
Это запрещено. Это выдаст ошибку.