【C++ 语言】容器 ( queue 队列 | stack 栈 | priority_queue 优先级队列 | set 集合 | 容器遍历 | map )(二)

1. 定义自定义类型 : 内部定义 age 成员变量 , 构造函数中设置该变量值 ;


//自定义容器
class Student {
public :
    int age; 
    //声明构造方法 , 后面的 : age(age) 
    //  左侧的 age 表示给 age 成员赋值 , 右边的表示参数中的 age 值
    Student(int age) : age(age){}
};


2. 自定义类型的排序方法定义 : 按照官方的定义方式定义排序方法 , 这里省略的模板方法相关内容 , 因为比较的就是 Student 类型对象 , 这里按照其 age 成员变量的大小进行比较 , age 成员变量最大的放在队首 ;


// Student 类对象排序方法定义
//  排序方式 : 左侧对象的 age 成员变量 , 大于右侧对象的 age 成员变量
struct StudentLess { 
    constexpr bool operator()(const Student& _Left, const Student& _Right) const { 
  return _Left.age < _Right.age;
    }
};


3. 声明自定义类型容器队列 :


( 1 ) 必须制定排序方法 : 注意此处必须指定 Student 对象之间的排序方式 , 否则编译时会报错 , 可以参考 less 和 greater 的实现 ;

( 2 ) 自定义的排序方法 : StudentLess , 其会将 Student 对象的 age 成员变量大的排在前面 ;

//自定义类型容器队列
    //  注意此处必须指定 Student 对象之间的排序方式 , 否则编译时会报错 
    //  可以参考 less 和 greater 的实现
    //自定义的排序方法 : StudentLess , 其会将 Student 对象的 age 成员变量大的排在前面
    priority_queue< Student, vector<Student>, StudentLess > pq_student;


4. 加入 Student 对象 : 使用构造方法创建 Student 对象 , 并将对象放入队列中 , 打印出队首元素 ;


//向自定义类型容器队列中加入 3 个对象 , 使用构造函数生成对象
    pq_student.push(Student(8));
    pq_student.push(Student(18));
    pq_student.push(Student(15));
    cout << "打印 pq_student 优先级队列的首元素 : pq_student.top().age : " << pq_student.top().age << endl;


5. 执行结果 :


打印 pq_student 优先级队列的首元素 : pq_student.top().age : 18




关联式容器


关联式容器操作 : 关联式容器的操作 , 与序列式容器调用方法基本一致 ;


关联式容器访问方式 : 通过关键字保存和访问元素 , 如 Java 中的 Map , Set ;




set 集合


1. Set 集合 : 内部是由红黑树实现的 , 每个节点都是一个元素 , 其元素不可重复 ;


2. 包含头文件 :


//引入 set 集合的头文件
#include <set>


3. 声明 set 集合 :


set<int> set_1 = {8 , 888 , 8888};


4. 插入元素 : 注意 set 集合中元素不能重复 , 如果插入重复的元素该操作是无效的 ;


//插入 18 , 集合中没有元素 18 , 此时插入成功
    set_1.insert(18);
    //插入 888 , 此时之前已经有了 888 元素 , set 集合不允许重复 , 本次插入失败
    set_1.insert(888);


5. 插入解析 : 上面的两个操作中 , 集合中已经有了 888 元素 , 再次插入 888 元素 , 该操作是无效的 ;


6. 插入返回值解析 : insert 返回值是一个键值对 , 返回值类型 : pair<iterator, bool> ;


( 1 ) 具体的返回值类型 : pair<set::iterator, bool> ;

( 2 ) 其键是一个迭代器 ;

( 3 ) 值是 bool 类型 , 如果插入成功值为 true , 否则为 false ;

7. 删除元素 : 删除一个元素 , 其大小发生了改变 ;


//删除某个元素
    set_1.erase(888); 
    //打印容器大小
    cout << "打印 set_1 删除 888 容量大小 : set_1.size() : " << set_1.size() << endl;


8. 代码示例 :


// VI . set 集合
    //  Set : 集合 , 内部是由红黑树实现的 , 每个节点都是一个元素 , 其元素不可重复
    set<int> set_1 = {8 , 888 , 8888};
    //插入 18 , 集合中没有元素 18 , 此时插入成功
    set_1.insert(18);
    //插入 888 , 此时之前已经有了 888 元素 , set 集合不允许重复 , 本次插入失败
    set_1.insert(888);
    //insert 返回值是一个键值对 , 其键是一个迭代器 ,
    //  值是 bool 类型 , 如果插入成功值为 true , 否则为 false
    //  返回值类型 : pair<iterator, bool>
    //  具体的返回值类型 : pair<set<int>::iterator, bool>
    //删除某个元素
    set_1.erase(888); 
    //打印容器大小
    cout << "打印 set_1 删除 888 容量大小 : set_1.size() : " << set_1.size() << endl;


9. 执行结果 :


打印 set_1 删除 888 容量大小 : set_1.size() : 3


上一篇:android开机自启


下一篇:为什么 Redis 要比 Memcached 更火?