【问题标题】:Use of cbegin and cend in vector在向量中使用 cbegin 和 cend
【发布时间】:2020-01-15 07:30:16
【问题描述】:

我想观察cbegin和begin的区别。

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

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

【问题讨论】:

  • 据我了解,这意味着只有您不能更改迭代器指向的项目的值,但您仍然可以修改容器(也就是擦除)

标签: c++ vector iterator erase const-iterator


【解决方案1】:

成员函数 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 改变向量的元素。

【讨论】:

    【解决方案2】:

    非常感谢来自莫斯科的弗拉德。

    我刚试过 *i=3;在我使用 cend 和 cbegin 的循环中。

    for (auto it = g1.cbegin(); it != g1.cend(); ++it){

                cout << *it << " ";
    
               *it=3;       
    
        }
    

    我得到编译错误: 错误:分配只读位置‘it.__gnu_cxx::__normal_iterator >::operator*()’ *它=3; ^

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      • 2021-03-30
      • 2014-10-20
      • 1970-01-01
      • 2015-09-21
      • 2011-08-14
      • 2016-11-16
      相关资源
      最近更新 更多