vector 的 cbegin 和 begin 有什么区别?

What is the difference between cbegin and begin for vector?

会员begin has two overloadings one of them is const_iterator begin() const;. There's also the cbeginconst_iterator cbegin() const noexcept;。它们都 returns const_iterator 到列表的开头。有什么区别?

begin 将 return 一个 iteratorconst_iterator 取决于调用它的对象的常量限定。

cbegin 将无条件 return 一个 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

begin() returns 一个 iterator 开始而 cbegin() returns 一个 const_iterator 开始。

这两者之间的基本区别是 iterator(即 begin())允许您更改它指向的对象的值,而 const_iterator 不会让您更改该值对象的。

例如:

这是允许的。矢量值更改为 {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;
}

这是不允许的。它会抛出一个错误:

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