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