在vector中使用cbegin和cend的用法

4

我想观察cbegin和begin之间的区别。

但是,当我使用cbegin时,得到的结果与使用begin相同。 根据定义,cbegin将返回const迭代器,我们无法使用由cbegin返回的const迭代器修改元素。 但是,我仍然能够删除特定位置的元素。

    for (auto i = g1.cbegin(); i != g1.cend(); ++i){             
            cout << *i << " ";
    }
    //below code erases element at const pointer
    g1.erase(i);

2
据我理解,它的意思是你只能不能改变迭代器所指向的项目的值,但你仍然可以修改容器(也就是擦除)。 - Philipp
2个回答

6
成员函数erase接受const_iterator(s)。
例如:
iterator erase(const_iterator position);

在早期标准中,该函数确实是使用非常量迭代器声明的。
请注意,该函数返回非常量迭代器,但它可以隐式转换为常量迭代器,并且可以与常量迭代器进行比较。
顺便提一句,这个调用
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删除向量的元素,因为向量本身不是常量。如果向量是常量,则无法删除其元素。
erase成员函数会改变向量本身(因此不能应用于常量向量),但它不会使用const_iterator更改向量的元素。

0
非常感谢来自莫斯科的 Vlad。
我刚刚在使用 cend 和 cbegin 的循环中尝试了 *i=3;。
for (auto it = g1.cbegin(); it != g1.cend(); ++it){
            cout << *it << " ";

           *it=3;       

    }

我收到了编译错误: 错误:无法分配只读位置“it.__gnu_cxx::__normal_iterator >::operator*()” * it = 3; ^

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接