我想观察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 的元素。

09-10 05:23