【问题标题】:Getting const_iterator from begin() instead of cbegin()从 begin() 而不是 cbegin() 获取 const_iterator
【发布时间】:2018-05-27 09:55:45
【问题描述】:

如果我取消注释该行,有人可以解释为什么以下内容无法编译 foo::const_iterator j = f.begin();,但如果我使用 foo::const_iterator j = f.cbegin(); 行,它会编译吗?我正试图让这条线像我的 std::vector 示例一样工作。

#include <vector>

struct foo {
    struct node { };
    node *first = nullptr, *last = nullptr;

    struct base_iterator {
        node* ptr;
        base_iterator (node* n) : ptr(n) { }
    };

    struct iterator : base_iterator { using base_iterator::base_iterator; };

    struct const_iterator : base_iterator { using base_iterator::base_iterator; };

    iterator begin() { return iterator(first); }
    const_iterator begin() const { return const_iterator(first); }
    const_iterator cbegin() const { return const_iterator(first); }
};

// Test

int main() {
    foo f;
    foo::iterator i = f.begin();
//  foo::const_iterator j = f.begin();  // Won't compile because f is not const.
//  foo::const_iterator j = f.cbegin();  // Will compile fine.

    std::vector<int> v;
    std::vector<int>::const_iterator it = v.begin();  // Compiles even though v is not const.
}

【问题讨论】:

  • 您为什么希望它起作用?不同的类型,和所有。对于vector,它不会神奇地发生。迭代器旨在提供可用的转换。
  • 我必须在迭代器和 const_iterator 类中进行哪些更改才能使其像 std::vector&lt;int&gt;::const_iterator 一样工作?
  • 添加转换c'tor或转换运算符。
  • 那么在const_iterator类中定义操作符const_iterator&amp; operator=(const iterator&amp; other),或者类似的拷贝构造函数?
  • 不,不是赋值运算符。转换运算符。请稍等

标签: c++ pointers iterator overloading const-iterator


【解决方案1】:

它适用于std::vector,因为所有标准库容器的迭代器设计以支持iterator --> const_iterator 转换。它旨在模仿指针转换的工作原理。

只要您的两个迭代器是用户定义的类,您就需要显式添加它。你有两个选择:

转换构造函数:

struct iterator : base_iterator { using base_iterator::base_iterator; };

struct const_iterator : base_iterator {
   using base_iterator::base_iterator;
   const_iterator(const iterator& other) : base_iterator(other) {}
};

转换运算符:

struct const_iterator : base_iterator { using base_iterator::base_iterator; };

struct iterator : base_iterator {
  using base_iterator::base_iterator; 
  operator const_iterator() const { /* ... */ }
};

【讨论】:

    猜你喜欢
    • 2021-03-30
    • 2020-08-28
    • 2015-09-21
    • 2011-07-03
    • 2020-08-30
    • 2011-09-28
    • 2017-07-23
    • 2020-10-14
    相关资源
    最近更新 更多