C++ 中常用的重点数据容器有:
- vector:动态数组,支持随机访问和快速插入和删除。
- list:双向链表,支持快速的插入和删除操作。
- deque:双端队列,支持快速的插入和删除操作,和 vector 相比,deque 的效率更高。
- set:基于红黑树实现的有序集合,不允许重复元素。
- map:基于哈希表实现的无序映射,支持快速的查找和插入和删除操作。
- queue:先进先出(FIFO)队列。
- stack:后进先出(LIFO)队列。
以下是一个使用 vector、list、deque、set 和 map 实现一个简单的学生管理系统的示例代码:
#include <iostream>
#include <vector>
#include <list>
#include <deque>
#include <set>
#include <map>
#include <string>
using namespace std;
// 学生类
class Student
{
public:
Student(const string &name, int age) : name(name), age(age) {}
// 重载 == 比较学生的姓名
bool operator==(const Student &s) const { return name == s.name; }
string name;
int age;
};
// 学生管理系统类
class StudentManageSystem
{
public:
// 添加学生
void AddStudent(const Student &s)
{
students.push_back(s);
// 使用 set 去重
nameSet.insert(s.name);
ageSet.insert(s.age);
// 使用 map 按姓名查询
nameMap[s.name] = &s;
}
// 删除学生
void DeleteStudent(const string &name)
{
// 使用 set 和 map 删除
students.remove(*nameMap[name]);
nameSet.erase(name);
ageSet.erase(ageMap[name]);
nameMap.erase(name);
}
// 修改学生
void UpdateStudent(const Student &s)
{
DeleteStudent(s.name);
AddStudent(s);
}
// 查询所有学生
void QueryAllStudents()
{
// 使用 set 遍历所有姓名
for (auto it = nameSet.begin(); it!= nameSet.end(); it++)
{
cout << "姓名: " << *it << endl;
// 使用 map 查询该姓名的学生信息
auto s = nameMap[*it];
cout << "年龄: " << s->age << endl;
}
}
// 查询指定姓名的学生
void QueryStudentByName(const string &name)
{
if (nameMap.find(name)!= nameMap.end())
{
// 使用 map 查询
auto s = nameMap[name];
cout << "姓名: " << s->name << endl;
cout << "年龄: " << s->age << endl;
}
else
{
cout << "未找到该学生" << endl;
}
}
// 查询指定年龄的学生
void QueryStudentByAge(int age)
{
// 使用 set 遍历所有年龄
for (auto it = ageSet.begin(); it!= ageSet.end(); it++)
{
if (*it == age)
{
// 使用 map 查询
auto s = *ageMap[age];
cout << "姓名: " << s.name << endl;
cout << "年龄: " << s.age << endl;
return;
}
}
cout << "未找到该年龄的学生" << endl;
}
private:
// 学生列表
vector<Student> students;
// 姓名集合
set<string> nameSet;
// 年龄集合
set<int> ageSet;
// 姓名-学生映射
map<string, Student*> nameMap;
// 年龄-学生映射
map<int, Student*> ageMap;
};
int main()
{
Student s1("Alice", 18);
Student s2("Bob", 20);
Student s3("Charlie", 22);
StudentManageSystem sms;
sms.AddStudent(s1);
sms.AddStudent(s2);
sms.AddStudent(s3);
// 删除学生
sms.DeleteStudent("Bob");
// 修改学生
Student s4("Bob", 21);
sms.UpdateStudent(s4);
// 查询所有学生
sms.QueryAllStudents();
// 查询指定姓名的学生
sms.QueryStudentByName("Alice");
// 查询指定年龄的学生
sms.QueryStudentByAge(23);
return 0;
}