【问题标题】:What is the difference between cbegin and begin for vector?向量的 cbegin 和 begin 有什么区别?
【发布时间】:2015-09-21 09:41:12
【问题描述】:

成员begin 有两个重载,其中一个是const_iterator begin() const;。还有cbeginconst_iterator cbegin() const noexcept;。它们都将const_iterator 返回到列表的开头。有什么区别?

【问题讨论】:

    标签: c++ vector stl iterator


    【解决方案1】:

    begin 将返回 iteratorconst_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 对象上表现完全一样......这真的有意义吗?
    • 这是为了灵活性。如果您知道您需要const_iterator,请致电cbegin。如果您知道您需要iterator,请致电begin,如果它无效,您将收到错误消息。如果您不关心,请致电begin
    • const_iteratoriterator有什么区别
    • @Asadefa - 查看答案here
    【解决方案2】:

    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;
    }
    

    【讨论】:

    • 第二个代码没有产生错误。效果很好,我试过了。
    • @Proton 我没有编译。它必须并且将在赋值运算符处失败,因为它不能对任何 const 具有语义上有效的重载。
    猜你喜欢
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多