cbegin和矢量的开头有什么区别?

时间:2015-07-03 14:00:12

标签: c++ vector stl iterator

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

2 个答案:

答案 0 :(得分:36)

begin将返回iteratorconst_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

答案 1 :(得分: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;
}

这是不允许的。 它将引发错误。