feat: Iterator

Implemented a demo for the Iterator.
This commit is contained in:
Yuki 2025-05-16 02:55:50 +08:00
parent 18694cf41f
commit 075d6cb132
Signed by: yuki
GPG Key ID: CF40579331C06C73
2 changed files with 66 additions and 0 deletions

58
16_iterator.cpp Normal file
View File

@ -0,0 +1,58 @@
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
class Iterator {
public:
virtual bool has_next() = 0;
virtual int next() = 0;
virtual ~Iterator() = default;
};
class IntContainer {
private:
vector<int> v;
public:
void add_i(int i) {
v.push_back(i);
}
shared_ptr<Iterator> begin();
};
class IntIterator : public Iterator {
vector<int>& v;
int index;
public:
IntIterator(vector<int>& v) : v(v), index(0) {}
virtual bool has_next() {
return index != v.size();
}
virtual int next() {
index += 1;
return v[index - 1];
}
};
shared_ptr<Iterator> IntContainer::begin() {
return make_shared<IntIterator>(this->v);
}
int main() {
IntContainer c;
c.add_i(1);
c.add_i(3);
c.add_i(5);
c.add_i(6);
// When you want to design a new container, you just
// implement a iterator, so user don't have to care the
// detail how the container work.
auto v = c.begin();
while (v->has_next()) {
cout << v->next() << endl;
}
}

View File

@ -105,3 +105,11 @@
命令模式通过引入统一的“命令对象”,将请求的发送者(前端)与执行者(后端)解耦。前端只需构造命令并发送,不关心命令的执行细节;而后端根据命令对象来执行相应逻辑。
更重要的是,所有操作都被抽象为统一的命令接口,这使得命令可以统一记录、排队、撤销、重做。多个前端只需绑定相同的命令对象,即可复用相同的后端逻辑,增强了代码复用性与系统扩展性。
## 迭代器模式Iterator
集合是一种常用的数据结构,用于维护一组对象。一个集合显然需要一种方式遍历其中的元素。如果针对每一种集合设计一种遍历的方式或者函数,使用者的代码与集合强相关,且使用者可能需要了解集合的实现细节,这显然很麻烦。
将集合的遍历行为抽象为通用的迭代器对象可以解决这些问题。集合的设计者只需要提供用于遍历操作的配套对象,使用者通过统一的接口得到下一个元素,直至结束,从而解耦了集合的实现与使用者的遍历逻辑。
在 C++ 中,标准库大量使用了这类思想,比如 vectormap 等集合,以及 sort 等算法库。