矢量的cbegin和begin有什么区别

What is the difference between cbegin and begin for vector?

本文关键字:什么 区别 begin cbegin      更新时间:2023-10-16

成员开始有两个重载,其中一个是const_iterator begin() const;。还有const_iterator cbegin() const noexcept;。它们都const_iterator返回到列表的开头。有什么区别?

begin将返回一个iterator或一个const_iterator,具体取决于调用它的对象的恒常资格。

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
begin()

iterator返回到开始,而cbegin()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;
}