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 一个 iterator
或 const_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;
}
会员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 一个 iterator
或 const_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;
}