我必须实现哪些函数才能使类可迭代?

Cas*_*sey 3 c++ iterator c++14

:我使用的,而不是像功能的标准提供的功能编写包含同一类的子对象的集合,并想遍历和索引一类,通过它们first()next()previous()last()getchild(x)等。

在c ++ 14中,在所有情况下都必须实现哪些函数以使类可迭代/可索引?

功能:

  • begin()
  • cbegin()
  • rbegin()
  • crbegin()
  • end()
  • cend()
  • rend()
  • crend()

浮现在脑海中,尽管不一定全部都需要实施。也可以选择(为方便程序员):

  • size()
  • empty()

是否还有其他的功能,我必须实现,如预增/减或后递增/递减和数组下标运算符,或者是它真的只是begin()end()及其变种?

R S*_*ahu 8

如果您的容器实现begin()并将其end()作为成员函数,并且这些函数的返回类型支持pre-increment运算符,则可以在大多数情况下使用它。我能想到的重要的是:

  1. range-for。您可以使用:

    Container c;
    for ( auto& item : c ) { ... }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 与迭代器一起使用的函数。例:

    Container c;
    Item item;
    std::find(c.begin(), c.end(), item);
    
    Run Code Online (Sandbox Code Playgroud)

使迭代器成为的子类std::iterator是确保它与所有标准算法兼容的最佳方法。(感谢@Adrian)。

  • 显然 `std::iterator` 在 C++17 中已被弃用。 (4认同)
  • “并且函数的返回类型支持pre-increment运算符。”迭代器还应该具有定义的typedef,例如“ value_type”等,否则在标准容器中使用它们可能无法编译。最好的方法是将`std :: iterator`子类化。 (2认同)
  • @RSahu根据https://www. Fluentcpp.com/2018/05/08/std-iterator-deprecated/`std::iterator`只是一个定义迭代器应提供的5种基本类型的结构。这 5 种基本类型并不复杂,并且 `std::iterator` 可以用 5 个 typedef/使用别名替换。据我所知,其余部分保持不变。 (2认同)