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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 【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


目录
相关文章
|
30天前
|
设计模式 程序员 C++
【C++ 泛型编程 高级篇】C++模板元编程:使用模板特化 灵活提取嵌套类型与多容器兼容性
【C++ 泛型编程 高级篇】C++模板元编程:使用模板特化 灵活提取嵌套类型与多容器兼容性
258 2
|
1天前
|
设计模式 C语言 C++
【C++进阶(六)】STL大法--栈和队列深度剖析&优先级队列&适配器原理
【C++进阶(六)】STL大法--栈和队列深度剖析&优先级队列&适配器原理
|
28天前
|
C++ 容器
【C++练级之路】【Lv.9】【STL】stack类和queue类的模拟实现
【C++练级之路】【Lv.9】【STL】stack类和queue类的模拟实现
|
算法 程序员 C语言
【C++ 迭代器】深入探讨 C++ 迭代器:标准与自定义容器中的 begin() 和 cbegin()
【C++ 迭代器】深入探讨 C++ 迭代器:标准与自定义容器中的 begin() 和 cbegin()
50 0
|
30天前
|
存储 安全 编译器
【C++ 17 泛型容器对比】C++ 深度解析:std::any 与 std::variant 的细微差别
【C++ 17 泛型容器对比】C++ 深度解析:std::any 与 std::variant 的细微差别
51 1
|
1月前
|
存储 自然语言处理 C++
map和set的简单介绍
map和set的简单介绍
20 1
|
1月前
|
存储 安全 Java
java集合框架及其特点(List、Set、Queue、Map)
java集合框架及其特点(List、Set、Queue、Map)
|
3月前
|
JavaScript 前端开发 定位技术
JavaScript 中如何代理 Set(集合) 和 Map(映射)
JavaScript 中如何代理 Set(集合) 和 Map(映射)
50 0
|
3月前
|
存储 安全 Java
Map和Set(JAVA)
Map和Set(JAVA)
50 1
|
3月前
|
编译器 C++ 容器
【C++学习手札】基于红黑树封装模拟实现map和set
【C++学习手札】基于红黑树封装模拟实现map和set