迭代器模式通过将遍历逻辑封装到独立的迭代器类中,使同一容器支持多种遍历方式。1. 定义统一接口iterator,包含hasnext()和next()方法;2. 实现dfsiterator使用栈实现深度优先遍历;3. 实现bfsiterator使用队列实现广度优先遍历;4. 容器类tree根据参数返回对应的迭代器实例;5. 用户通过统一接口操作不同遍历方式,无需关心内部实现细节。这种方式提高了代码可扩展性和维护性,同时降低了容器与遍历逻辑的耦合度。
在C++中,迭代器模式支持多种遍历方式(比如深度优先和广度优先),关键在于将不同的遍历逻辑封装到不同的迭代器类中。这样做的好处是使用者不需要关心底层结构如何遍历,只需要通过统一的接口操作即可。
下面我们就来看看,怎么用迭代器来实现这两种常见的遍历方式。
迭代器模式的核心思想是将遍历逻辑从容器中抽离出来,交给专门的迭代器对象处理。这样做的优势在于:
立即学习“C++免费学习笔记(深入)”;
在C++中,我们通常定义一个公共的迭代器基类或接口(如Iterator),然后为每种遍历方式提供具体实现(如DFSIterator, BFSIterator)。
为了支持深度优先(DFS)和广度优先(BFS),我们需要先设计一个通用的迭代器接口。基本功能包括:
class Iterator { public: virtual bool hasNext() = 0; virtual int next() = 0; };
然后针对不同遍历策略分别实现:
适用于树形结构,比如二叉树。可以用栈来模拟递归:
class DFSIterator : public Iterator { private: std::stack<Node*> stack_; public: DFSIterator(Node* root) { if (root) stack_.push(root); } bool hasNext() override { return !stack_.empty(); } int next() override { Node* node = stack_.top(); stack_.pop(); // 假设是二叉树,先压右后压左,保证左子树先访问 if (node->right) stack_.push(node->right); if (node->left) stack_.push(node->left); return node->value; } };
适用于图或者树的层序遍历,通常使用队列实现:
class BFSIterator : public Iterator { private: std::queue<Node*> queue_; public: BFSIterator(Node* root) { if (root) queue_.push(root); } bool hasNext() override { return !queue_.empty(); } int next() override { Node* node = queue.front(); queue.pop(); // 将子节点加入队列(如果是图,要加访问标记) for (Node* child : node->children) { if (child) queue_.push(child); } return node->value; } };
这两个类都实现了相同的接口,但内部遍历顺序完全不同。
假设我们有一个树结构的容器类,我们可以根据需要返回不同的迭代器实例:
class Tree { private: Node* root_; public: Tree(Node* root) : root_(root) {} std::unique_ptr<Iterator> createIterator(const std::string& type) { if (type == "dfs") { return std::make_unique<DFSIterator>(root_); } else if (type == "bfs") { return std::make_unique<BFSIterator>(root_); } return nullptr; } };
用户使用时:
Tree tree(root); auto it = tree.createIterator("dfs"); while (it->hasNext()) { std::cout << it->next() << " "; }
基本上就这些了。用迭代器支持多种遍历方式其实并不复杂,但需要注意把遍历逻辑和数据结构分离清楚,才能真正发挥出模式的优势。
以上就是C++迭代器模式怎样支持多种遍历 深度优先与广度优先实现的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号