本人想求做网站,wordpress启用域名邮,一千元左右最好的手机,公司网址格式怎么写【声明】本题目来源于卡码网#xff08;https://kamacoder.com/#xff09; 【提示#xff1a;如果不想看文字介绍#xff0c;可以直接跳转到C编码部分】 【设计模式大纲】 【简介】 --什么是迭代器模式#xff08;第19种设计模式#xff09; 迭代器模式是⼀种行为设计模… 【声明】本题目来源于卡码网https://kamacoder.com/ 【提示如果不想看文字介绍可以直接跳转到C编码部分】 【设计模式大纲】 【简介】 --什么是迭代器模式第19种设计模式 迭代器模式是⼀种行为设计模式是⼀种使⽤频率⾮常⾼的设计模式在各个语⾔中都有应用其主要⽬的是提供⼀种统⼀的⽅式来访问⼀个聚合对象中的各个元素而不需要暴露该对象的内部表示。通过迭代器客户端可以顺序访问聚合对象的元素而无需了解底层数据结构。 迭代器模式应⽤⼴泛但是⼤多数语⾔都已经内置了迭代器接⼝不需要⾃⼰实现。 【基本结构】 迭代器模式包括以下⼏个重要角色
迭代器接口Iterator 定义访问和遍历元素的接⼝, 通常会包括hasNext() ⽅法⽤于检查是否还有下⼀个元素以及next() ⽅法⽤于获取下⼀个元素。有的还会实现获取第⼀个元素以及获取当前元素的⽅法。具体迭代器ConcreateIterator 实现迭代器接⼝实现遍历逻辑对聚合对象进⾏遍历。抽象聚合类定义了创建迭代器的接⼝包括⼀个createIterator ⽅法⽤于创建⼀个迭代器对象。具体聚合类实现在抽象聚合类中声明的createIterator() ⽅法返回⼀个与具体聚合对应的具体迭代器 【简易实现--Java】 下面以Java代码作以说明
1. 定义迭代器接口通常会有检查是否还有下⼀个元素以及获取下⼀个元素的⽅法。
// 迭代器接⼝
public interface Iterator{// 检查是否还会有下⼀个元素boolean hasNext();// 获取下⼀个元素Object next();
}
2. 定义具体迭代器实现迭代器接口遍历集合。
public class ConcreteIterator implements Iterator {private int index;private ListObject elements;// 构造函数初始化迭代器public ConcreteIterator(ListObject elements) {this.elements elements;this.index 0;}Overridepublic boolean hasNext() {return index elements.size();}Overridepublic Object next() {if (hasNext()) {return elements.get(index);}return null;}
}
3. 定义聚合接口通常包括createIterator() ⽅法⽤于创建迭代器
public interface Iterable {Iterator createIterator();
}
4. 实现具体聚合创建具体的迭代器
// 具体聚合
public class ConcreteIterable implements Iterable {private ListObject elements;// 构造函数初始化可迭代对象public ConcreteIterable(ListObject elements) {this.elements elements;}Overridepublic Iterator createIterator() {return new ConcreteIterator(elements);}
}
5. 客户端使用
/**
* version Copyright (c) 2024 NCDC, Servo。 Unpublished - All rights reserved
* file TemplateMethodMode.hpp
* brief 模板方法模式
* autor 写代码的小恐龙er
* date 2024/01/23
*/
import java.util.ArrayList;
import java.util.List;
public class IteratorPatternExample {public static void main(String[] args) {ListObject elements new ArrayList();elements.add(Element 1);elements.add(Element 2);elements.add(Element 3);Iterable iterable new ConcreteIterable(elements);Iterator iterator iterable.createIterator();while (iterator.hasNext()) {System.out.println(iterator.next());}}
} 【使用场景】 迭代器模式是⼀种通用的设计模式其封装性强简化了客户端代码客户端不需要知道集合的内部结构只需要关心迭代器和迭代接口就可以完成元素的访问。但是引⼊迭代器模式会增加额外的类每增加⼀个集合类都需要增加该集合对应的迭代器这也会使得代码结构变得更加复杂。 许多编程语⾔和框架都使用了这个模式提供⼀致的遍历和访问集合元素的机制。下⾯是几种常见语⾔迭代器模式的实现。
1. Java语言 集合类如ArrayList、LinkedList), 通过Iterator 接⼝可以遍历集合中的元素。
ListString list new ArrayList();
list.add(Item 1);
list.add(Item 2);
list.add(Item 3);IteratorString iterator list.iterator();
while (iterator.hasNext()) {System.out.println(iterator.next());
}
2. Python语言 使用迭代器和⽣成器来实现迭代模式 iter() 和next() 函数可以⽤于创建和访问迭代器。
elements [Element 1, Element 2, Element 3]
iterator iter(elements)while True:try:element next(iterator)print(element)except StopIteration:break
3. C语言 C中的STL提供了迭代器的⽀持 begin() 和end() 函数可以⽤于获取容器的起始和结束迭代器。
#include iostream
#include vector
int main() {std::vectorstd::string elements {Element 1, Element 2, Element 3};for (auto it elements.begin(); it ! elements.end(); it) {std::cout *it std::endl;}return 0;
}
4. JavaScript语言 ES6中新增了迭代器协议使得遍历和访问集合元素变得更加方便。
// 可迭代对象实现可迭代协议
class IterableObject {constructor() {this.elements [];}addElement(element) {this.elements.push(element);}[Symbol.iterator]() {let index 0;// 迭代器对象实现迭代器协议return {next: () {if (index this.elements.length) {return { value: this.elements[index], done: false };} else {return { done: true };}}};}
}
// 使⽤迭代器遍历可迭代对象
const iterableObject new IterableObject();
iterableObject.addElement(Element 1);
iterableObject.addElement(Element 2);
iterableObject.addElement(Element 3);for (const element of iterableObject) {console.log(element);
} 【编码部分】
1. 题目描述 小明是一位老师在进行班级点名时希望有一个学生名单系统请你实现迭代器模式提供一个迭代器使得可以按顺序遍历学生列表。
2. 输入描述 第一行是一个整数 N 1 N 100), 表示学生的数量。接下来的 N 行每行包含一个学生的信息格式为 姓名 学号
3. 输出描述 输出班级点名的结果即按顺序遍历学生列表输出学生的姓名和学号
4. C编程实例
/**
* version Copyright (c) 2024 NCDC, Servo。 Unpublished - All rights reserved
* file IteratorMode.hpp
* brief 迭代器模式
* autor 写代码的小恐龙er
* date 2024/01/23
*/#include iostream
#include iomanip
#include string
#include vectorusing namespace std;// 前置声明// 聚合元素类 -- 学生
class Student;// 迭代器接口 -- 提前声明模板
templateclass T
class Iterator;// 具体迭代器 -- 学生遍历 迭代类
class ConcreteStudentIterator;// 聚合接口 -- 学生全体类
class StudentCollection;// 具体的聚合类 -- 创建全体学生
class ConcreteStudentCollection;// 类的实现// 聚合元素类 -- 学生
class Student{
// 成员数据
private:string _name;int _idNumber;
// 成员函数
public:// 构造函数Student(string name, int id){this-_name name;this-_idNumber id;}// 获取成员数据string GetName(){return this-_name;}int GetIdNumber(){return this-_idNumber;}
};// 迭代器接口
// 类模板
templateclass T
class Iterator{
// 迭代器接口
public:// 接口函数声明为 纯虚函数virtual bool isHavNext() 0;virtual T* Next() 0;
};// 具体迭代器 -- 学生遍历 迭代类
class ConcreteStudentIterator : public IteratorStudent
{
// 成员数据
private:std::vectorStudent * _studentsVec;int _currentIndex 0;
// 成员函数
public:// 构造函数ConcreteStudentIterator(std::vectorStudent * studentsVec){this-_studentsVec studentsVec;}// 重载接口函数bool isHavNext() override{return _currentIndex _studentsVec.size();}Student* Next() override {if(isHavNext()){return _studentsVec[_currentIndex];}return nullptr;}
};// 聚合接口 -- 学生全体类
class StudentCollection
{
// 迭代器对象 接口函数
public:virtual IteratorStudent * iterator() 0;
};// 具体的聚合类 -- 创建全体学生
class ConcreteStudentCollection : public StudentCollection
{
// 成员数据
private:std::vectorStudent * _students;
// 成员函数
public:// 构造函数ConcreteStudentCollection(){}ConcreteStudentCollection(std::vectorStudent * students){this-_students students;}// 添加学生对象void AddStudent(Student * student){_students.push_back(student);}// 迭代器接口函数重载 返回值为迭代器基类的指针 模板类型为StudentIteratorStudent * iterator() override{// 涉及到 隐式地 向上类型转换 派生类 转换为 基类 线程安全return new ConcreteStudentIterator(_students);}
};int main()
{// 学生数量int studentNum 0;// 输入std::cin studentNum;// 创建学生类Student *student nullptr;// 创建具体可迭代对象ConcreteStudentCollection *concreteStudentCollection new ConcreteStudentCollection();// 学生遍历for(int i 0; i studentNum; i){// 学生姓名和学号string name ;int numberId 0;// 输入std::cin name numberId;// 构造学生类student new Student(name, numberId);// 将学生放入 学生收集器类 中 concreteStudentCollection-AddStudent(student);}// 遍历结束后 再来通过迭代器模式 进行 信息打印// 调用具体聚合类中的 迭代器生成 接口IteratorStudent *iterator concreteStudentCollection-iterator();while(iterator-isHavNext()){// 从迭代器中的学生集合获取学生类student iterator-Next();// 打印学生信息if(student ! nullptr){// 由于学生类中的成员数据为私有类型 记得调用接口函数去获取成员数据// 输出长度不足补0 固定输出长度为3std::cout student-GetName() setw(3) setfill(0) student-GetIdNumber() endl;}else std::cout Invalid input endl;}// 记得析构// 记得析构// 记得析构if(student ! nullptr){delete student;student nullptr;}delete concreteStudentCollection;concreteStudentCollection nullptr;return 0;
} ......
To be continued.