【发布时间】:2015-09-21 09:41:12
【问题描述】:
成员begin 有两个重载,其中一个是const_iterator begin() const;。还有cbeginconst_iterator cbegin() const noexcept;。它们都将const_iterator 返回到列表的开头。有什么区别?
【问题讨论】:
成员begin 有两个重载,其中一个是const_iterator begin() const;。还有cbeginconst_iterator cbegin() const noexcept;。它们都将const_iterator 返回到列表的开头。有什么区别?
【问题讨论】:
begin 将返回 iterator 或 const_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
【讨论】:
const_iterator,请致电cbegin。如果您知道您需要iterator,请致电begin,如果它无效,您将收到错误消息。如果您不关心,请致电begin。
const_iterator和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;
}
【讨论】:
const 具有语义上有效的重载。