c++ 容器

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;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值