9/30
软件设计 石家庄铁道大学信息学院
实验18:迭代器模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解迭代器模式的动机,掌握该模式的结构;
2、能够利用迭代器模式解决实际问题。
[实验任务一]:JAVA和C++常见数据结构迭代器的使用
信1305班共44名同学,每名同学都有姓名,学号和年龄等属性,分别使用JAVA内置迭代器和C++中标准模板库(STL)实现对同学信息的遍历,要求按照学号从小到大和从大到小两种次序输出学生信息。
实验要求:
1. 搜集并掌握JAVA和C++中常见的数据结构和迭代器的使用方法,例如,vector, list, map和set等;
Java中的数据结构和迭代器
1. ArrayList
• 用途:动态数组,随机访问效率高。
• 迭代器:使用Iterator或增强型for循环。
java
List<String> list = new ArrayList<>();
list.add("Element1");
list.add("Element2");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
2. LinkedList
• 用途:链表,适合频繁的插入和删除操作。
• 迭代器:使用ListIterator,支持双向遍历。
java
List<String> list = new LinkedList<>();
list.add("Element1");
list.add("Element2");
ListIterator<String> listIterator = list.listIterator();
while (listIterator.hasNext()) {
System.out.println(listIterator.next());
}
3. HashMap
• 用途:基于哈希表的Map接口实现,存储键值对。
• 迭代器:使用Map.Entry的Set集合进行迭代。
java
Map<String, Integer> map = new HashMap<>();
map.put("Key1", 1);
map.put("Key2", 2);
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
4. HashSet
• 用途:不允许重复的集合。
• 迭代器:使用Iterator。
java复制
Set<String> set = new HashSet<>();
set.add("Element1");
set.add("Element2");
for (String element : set) {
System.out.println(element);
}
C++中的数据结构和迭代器
1. vector
• 用途:动态数组,随机访问效率高。
• 迭代器:使用begin()和end()方法。
cpp
std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
2. list
• 用途:双向链表,适合频繁的插入和删除操作。
• 迭代器:使用begin()和end()方法。
cpp
std::list<int> lst = {1, 2, 3, 4, 5};
for (auto it = lst.begin(); it != lst.end(); ++it) {
std::cout << *it << " ";
}
3. map
• 用途:基于红黑树的键值对容器。
• 迭代器:使用begin()和end()方法。
cpp
std::map<std::string, int> m = {{"one", 1}, {"two", 2}};
for (auto it = m.begin(); it != m.end(); ++it) {
std::cout << it->first << " : " << it->second << std::endl;
}
4. set
• 用途:不允许重复的集合。
• 迭代器:使用begin()和end()方法。
cpp复制
std::set<int> s = {1, 2, 3, 4, 5};
for (auto it = s.begin(); it != s.end(); ++it) {
std::cout << *it << " ";
}
2. 提交源代码;
import java.util.*;
JAVA:
// 学生类
class Student {
String name;
String id;
int age;
public Student(String name, String id, int age) {
this.name = name;
this.id = id;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", id='" + id + '\'' +
", age=" + age +
'}';
}
}
public class IteratorDemo {
public static void main(String[] args) {
List<Student> students = new ArrayList<>();
// 添加学生信息
students.add(new Student("Alice", "001", 20));
students.add(new Student("Bob", "002", 22));
students.add(new Student("Charlie", "003", 21));
// 正序遍历
System.out.println("正序遍历:");
for (Student student : students) {
System.out.println(student);
}
// 反序遍历
System.out.println("\n反序遍历:");
for (int i = students.size() - 1; i >= 0; i--) {
System.out.println(students.get(i));
}
}
}
C++:
#include <iostream>
#include <vector>
#include <algorithm>
// 学生类
class Student {
public:
std::string name;
std::string id;
int age;
Student(std::string name, std::string id, int age) : name(name), id(id), age(age) {}
friend std::ostream& operator<<(std::ostream& os, const Student& student) {
os << "Student{" << "name='" << student.name << '\'' << ", id='" << student.id << '\'' << ", age=" << student.age << '}';
return os;
}
};
int main() {
std::vector<Student> students;
// 添加学生信息
students.emplace_back("Alice", "001", 20);
students.emplace_back("Bob", "002", 22);
students.emplace_back("Charlie", "003", 21);
// 正序遍历
std::cout << "正序遍历:" << std::endl;
for (const auto& student : students) {
std::cout << student << std::endl;
}
// 反序遍历
std::cout << "\n反序遍历:" << std::endl;
for (auto it = students.rbegin(); it != students.rend(); ++it) {
std::cout << *it << std::endl;
}
return 0;
}
3. 注意编程规范。

浙公网安备 33010602011771号