JAVA和C++常见数据结构迭代器的使用
信1305班共44名同学,每名同学都有姓名,学号和年龄等属性,分别使用JAVA内置迭代器和C++中标准模板库(STL)实现对同学信息的遍历,要求按照学号从小到大和从大到小两种次序输出学生信息。
实验要求:
1. 搜集并掌握JAVA和C++中常见的数据结构和迭代器的使用方法,例如,vector, list, map和set等;
Vector容器
特点:地址不变,内存空间连续,所以在中间进行插入和删除时会造成内存块拷贝,如果插入的是结构体或者类,则会造成构造和析构,性能不是特别高,对结尾元素操作最快。
优点:支持随机访问,即下标访问和迭代器访问,所以查询效率高。
缺点:往头部或中部插入或删除元素时,为了保持原本的相对次序,插入或删除之后的所有元素都必须移动,所以插入效率比较低。
适用场景:适用于对象简单,变化较小,并且频繁随机访问的场景。
List容器
特点:List是双向链表实现而成。元素存放与堆区,每个元素都是放在一块内存中,他的内存空间可以是不连续的,通过指针来进行数据的访问。没有提供迭代器,每删除一个元素都会释放它占用的内存,可以在任意地方插入和删除,访问头尾两个元素最快,其他元素的访问时间一样。
优点:内存不连续,动态操作,可以在任意位置插入或删除且效率高。
缺点:不支持随机访问
适用场景:经常进行插入和删除并且不经常随机访问的场景。
Map容器
Map由红黑树实现,其元素都是“键值/实值”,所形成的一个对祖(key/value paris)。每个元素都有一个键,是排序准则的基础。每个键只能出现一次,不允许重复。
Map主要用于资料一对一映射的情况,Map内部自建一棵红黑树,这棵树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的。比如一个班级中,每个学生的学号跟他的姓名就存在着一对一映射的关系。
优点:使用平衡二叉树实现,便于元素查找,且能把一个值映射成另一个值。
缺点:每次插入都需要调整红黑树,效率有一定影响。
2. 提交源代码;
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Student
{
public:
int id;
string name;
int age;
public:
Student(int id, string name, int age) : id(id), name(name), age(age)
{}
};
// 比较函数,按学号升序排序
bool compareByIdUp(const Student &a, const Student &b)
{
return a.id < b.id;
}
//按学号降序排序
bool compareByIdDown(const Student &a, const Student &b)
{
return a.id > b.id;
}
// 打印学生信息
void printStudentInfo(vector<Student> &v)
{
for (vector<Student>::iterator it = v.begin(); it != v.end(); it++)
{
cout << "学号:" << (*it).id << " 姓名:" << (*it).name << " 年龄:" << (*it).age << endl;
}
cout << endl;
}
int main()
{
vector<Student> students;
students.emplace_back(20211234, "张三", 21);
students.emplace_back(20214352, "李四", 21);
students.emplace_back(20214444, "小明", 21);
students.emplace_back(20217462, "小王", 21);
students.emplace_back(20212344, "小张", 21);
// 使用 sort 函数和比较函数按学号升序排序
sort(students.begin(), students.end(), compareByIdUp);
cout << "按学号升序排列" << endl;
// 打印排序后的学生信息
printStudentInfo(students);
// 使用 sort 函数和比较函数按学号降序排序
sort(students.begin(), students.end(), compareByIdDown);
cout << "按学号降序排列" << endl;
// 打印排序后的学生信息
printStudentInfo(students);
return 0;
}