cbegin和vector之间有什么区别?

use*_*882 26 c++ iterator stl vector

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

Tar*_*ama 40

begin将返回一个iterator或一个const_iterator取决于它被调用的对象的const限定.

cbeginconst_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
Run Code Online (Sandbox Code Playgroud)

  • 就是这样?所以事实上,我们有两个函数在 const 对象上的行为完全相同......这是否有意义? (5认同)
  • 是为了灵活性。如果你知道你需要一个 `const_iterator`,调用 `cbegin`。如果你知道你需要一个 `iterator`,调用 `begin`,如果它无效,你会得到一个错误。如果您不在乎,请调用“开始”。 (4认同)
  • @user3663882:请参阅http://stackoverflow.com/questions/12001410/what-is-the-reason-behind-cbegin-cend (2认同)

hea*_*ter 20

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;
}
Run Code Online (Sandbox Code Playgroud)

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

for (it = v.cbegin(); it != v.cend(); it++)
{
    *it = *it - 10;
}
Run Code Online (Sandbox Code Playgroud)