我想观察cbegin和begin之间的区别。
但是当我使用cbegin时,我得到的结果与开始相同。
根据定义,cbegin将返回const itertaor,我们不能使用cbegin返回的const iterator修改元素。
但是,我仍然能够擦除特定位置的元素。
for (auto i = g1.cbegin(); i != g1.cend(); ++i){
cout << *i << " ";
}
//below code erases element at const pointer
g1.erase(i);
最佳答案
成员函数擦除接受const_iterator。
例如
iterator erase(const_iterator position);
在早期的Standards中,该函数确实是使用非常量迭代器声明的。
考虑到该函数返回一个非常量迭代器,但是可以将其隐式转换为常量迭代器,并且可以将其与常量迭代器进行比较。
顺便这个电话
g1.erase(i);
不会擦除任何内容,因为循环
i
之后等于函数cend
返回的迭代器,前提是名称i在循环之前定义。auto i = g1.cbegin();
for (; i != g1.cend(); ++i){
cout << *i << " ";
}
//below code erases element at const pointer
g1.erase(i);
您可以使用const_iterator删除 vector 的元素,因为 vector 本身不是常数。如果 vector 是常数,则无法删除其元素。
那就是
erase
成员函数改变了 vector 本身(因此它可能不会应用于常量 vector ),但是它并没有使用const_iterator来改变 vector 的元素。