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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 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


目录
相关文章
|
3天前
|
存储 C++ 容器
C++标准库中提供了哪些数据容器作为数组的替代
C++标准库中提供了哪些数据容器作为数组的替代
15 5
|
10天前
|
安全 程序员 C++
C++一分钟之-C++中的并发容器
【7月更文挑战第17天】C++11引入并发容器,如`std::shared_mutex`、`std::atomic`和线程安全的集合,以解决多线程中的数据竞争和死锁。常见问题包括原子操作的误用、锁的不当使用和迭代器失效。避免陷阱的关键在于正确使用原子操作、一致的锁管理以及处理迭代器失效。通过示例展示了如何安全地使用这些工具来提升并发编程的安全性和效率。
14 1
|
24天前
|
存储 C++ 索引
|
3天前
|
C++
什么是析构函数,它在C++类中起什么作用
什么是析构函数,它在C++类中起什么作用?
21 11
|
3天前
|
C++
能不能说一个C++类的简单示例呀?能解释一下组成部分更好了
能不能说一个C++类的简单示例呀?能解释一下组成部分更好了
27 10
|
15天前
|
设计模式 安全 编译器
【C++11】特殊类设计
【C++11】特殊类设计
38 10
|
20天前
|
C++
C++友元函数和友元类的使用
C++中的友元(friend)是一种机制,允许类或函数访问其他类的私有成员,以实现数据共享或特殊功能。友元分为两类:类友元和函数友元。类友元允许一个类访问另一个类的私有数据,而函数友元是非成员函数,可以直接访问类的私有成员。虽然提供了便利,但友元破坏了封装性,应谨慎使用。
47 9
|
16天前
|
存储 编译器 C语言
【C++基础 】类和对象(上)
【C++基础 】类和对象(上)
|
24天前
|
编译器 C++
【C++】string类的使用④(字符串操作String operations )
这篇博客探讨了C++ STL中`std::string`的几个关键操作,如`c_str()`和`data()`,它们分别返回指向字符串的const char*指针,前者保证以&#39;\0&#39;结尾,后者不保证。`get_allocator()`返回内存分配器,通常不直接使用。`copy()`函数用于将字符串部分复制到字符数组,不添加&#39;\0&#39;。`find()`和`rfind()`用于向前和向后搜索子串或字符。`npos`是string类中的一个常量,表示找不到匹配项时的返回值。博客通过实例展示了这些函数的用法。
|
24天前
|
存储 C++
【C++】string类的使用③(非成员函数重载Non-member function overloads)
这篇文章探讨了C++中`std::string`的`replace`和`swap`函数以及非成员函数重载。`replace`提供了多种方式替换字符串中的部分内容,包括使用字符串、子串、字符、字符数组和填充字符。`swap`函数用于交换两个`string`对象的内容,成员函数版本效率更高。非成员函数重载包括`operator+`实现字符串连接,关系运算符(如`==`, `&lt;`等)用于比较字符串,以及`swap`非成员函数。此外,还介绍了`getline`函数,用于按指定分隔符从输入流中读取字符串。文章强调了非成员函数在特定情况下的作用,并给出了多个示例代码。