跳转至

迭代器

1 自定义可迭代类

在 C++ 中,自定义可迭代类(Iterable Class)可以通过实现迭代器(Iterator)来实现。迭代器是一个对象,用于遍历容器中的元素。通过实现迭代器,可以使自定义类支持范围 for 循环和其他基于迭代器的操作。

1.1 实现步骤

  1. 定义迭代器类:迭代器类需要实现 begin()end() 方法,并重载 operator*operator++operator!= 等操作符。
  2. 定义容器类:容器类需要实现 begin()end() 方法,返回迭代器的实例。

1.2 示例代码

以下是一个简单的示例代码,展示了如何实现一个自定义的可迭代类:

#include <iostream>
#include <vector>

// 自定义容器类
class MyContainer {
public:
    // 构造函数
    MyContainer(const std::vector<int>& data) : data_(data) {}

    // 迭代器类
    class Iterator {
    public:
        // 构造函数
        Iterator(std::vector<int>::const_iterator iter) : iter_(iter) {}

        // 重载解引用操作符
        const int& operator*() const {
            return *iter_;
        }

        // 重载前置递增操作符
        Iterator& operator++() {
            ++iter_;
            return *this;
        }

        // 重载不等操作符
        bool operator!=(const Iterator& other) const {
            return iter_ != other.iter_;
        }

    private:
        std::vector<int>::const_iterator iter_;
    };

    // 返回起始迭代器
    Iterator begin() const {
        return Iterator(data_.begin());
    }

    // 返回结束迭代器
    Iterator end() const {
        return Iterator(data_.end());
    }

private:
    std::vector<int> data_;
};

int main() {
    std::vector<int> data = {1, 2, 3, 4, 5};
    MyContainer container(data);

    // 使用范围 for 循环遍历容器
    for (int value : container) {
        std::cout << value << " ";
    }
    std::cout << std::endl;

    return 0;
}

1.3 代码解释

  1. 定义迭代器类:迭代器类 Iterator 实现了 operator*operator++operator!= 操作符,用于解引用、递增和比较迭代器。
  2. 定义容器类:容器类 MyContainer 实现了 begin()end() 方法,返回迭代器的实例。
  3. 使用范围 for 循环遍历容器
    for (int value : container) {
        std::cout << value << " ";
    }
    std::cout << std::endl;
    
    使用范围 for 循环遍历 MyContainer 容器,输出容器中的元素。

1.4 总结

通过实现迭代器类和容器类,可以使自定义类支持范围 for 循环和其他基于迭代器的操作。迭代器类需要实现 operator*operator++operator!= 等操作符,容器类需要实现 begin()end() 方法,返回迭代器的实例。理解这些概念和实现方法有助于编写更灵活和可扩展的 C++ 代码。

这只是一个简单的示例,实际上,迭代器设计可能会更加复杂,特别是在处理更复杂的数据结构时。如果你的类仅包含一个容器,你也可以考虑继承自 std::iterator 或使用 C++标准库的 std::beginstd::end 来简化迭代器的实现。