cbegin和begin在vector中有什么区别?

92

成员begin有两个重载版本之一是const_iterator begin() const;。还有cbeginconst_iterator cbegin() const noexcept;,两者都返回指向列表开始的const_iterator。两者有何区别?

2个回答

127

begin将根据调用它的对象的const限定符返回一个迭代器或const迭代器。

cbegin无条件地返回一个const迭代器。

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

7
就这样?所以实际上,我们有两个函数在 const 对象上完全表现相同... 这真的有意义吗? - user3663882
6
这是为了灵活性。如果你知道你需要一个“const_iterator”,就调用“cbegin”。如果你知道你需要一个“iterator”,就调用“begin”,如果它无效,则会出错。如果你不在意,就调用“begin”。 - TartanLlama
2
@user3663882:请参考https://dev59.com/AWct5IYBdhLWcg3wjuIj - Christian Hackl
const_iteratoriterator之间有什么区别? - user12211554
1
@Asadefa - 在这里查看答案:https://dev59.com/OXVC5IYBdhLWcg3wZwJT#309589 - clk

32

begin() 返回一个指向开头的迭代器,而 cbegin() 返回一个指向开头的常量迭代器。

这两者之间的基本区别是迭代器(即 begin())允许修改其指向的对象的值,而常量迭代器则不允许修改对象的值。

例如:

以下操作是允许的。向量的值更改为{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;
}

第二个代码没有产生错误,它运行良好,我已经尝试过了。 - Proton
@Proton无法编译。必定会在赋值运算符上失败,因为它不能对任何“const”进行语义有效的重载。 - lopho
begin()并不总是返回iterator:它取决于容器的常量性。如果容器是常量的,begin()将返回const_iterator而不是iterator - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接