首页 > 编程语言 >C++做算法题,容器知识看这一篇就够啦!

C++做算法题,容器知识看这一篇就够啦!

时间:2024-08-17 22:37:43浏览次数:12  
标签:arr 元素 C++ st 算法 vector que 就够 100

C++常用容器分享(算法题,掌握这些就够了)

vector

是什么

连续的顺序存储结构,其实就是一个可变数组
想使用的话记得 #include<vector>

怎么用

初始化语法 vector<类型> 名字(长度,初始值)

演示一下

// 一维的vector 
vector<int> arr; // 不指定里面有多少个元素
vector<int> arr(100); // 指定里面有100个元素 这100个元素都是默认值 0
vector<int> arr(100, 1); // 指定里面有100个元素,每个元素指定为1

// 二维的vector 
vector<vector<int>> arr;  // 不初始化行列  
vector<vector<int>> arr(100, vector<int>()); // 100行 但是没初始化列数
vector<vector<int>> arr(100, vector<int>(100, 1)); // 100行100列 每个值都是1

常用的操作

列举一下

arr.push_back(1) // 把1插入到这个vector的尾部   长度 +1 
arr.pop_back() // 把最后一个元素删除了   长度  -1    
arr.size() // 获取长度
arr.clear() // 清空
arr.empty() // 返回值是bool 是空的就返回true
arr.resize(新长度, 默认值) 
// 如果是缩短,则删除多余的值  如果是扩大,且指定了默认值,则新元素均为默认值(旧元素不变)

stack

是什么

通过二次封装双端队列 (deque) 容器,实现先进后出的栈数据结构。
想使用的话记得 #include<stack>

怎么用

初始化 stack<类型> 名字

常用操作

// stk是我们初始化好的栈
stk.push(1) // 把 1进栈
stk.pop() //  把栈顶元素出栈   注意 这个没法取到栈顶元素  只是把他扔出去
stk.top() //  取到栈顶元素
stk.size() // 获得栈的大小
stk.empty() 

注意 :

  1. 没有 clear resize 方法
  2. 不能取内部元素 不能遍历

queue

是什么

通过二次封装双端队列 (deque) 容器,实现先进先出的队列数据结构。
使用记得 #include<queue>

怎么用

初始化 queue<类型> que

que.push() // 入队
que.pop() // 出队
que.front() // 取队首 
que.back() // 取队尾
que.size() // 大小
que.empty() 

注意:

  1. 没有 clear resize 方法
  2. 不能取内部元素 不能遍历

优先队列

是什么

一个持续维护元素有序性的队列 也就是一个堆
提供常数时间的最大元素查找,对数时间的插入与提取,底层原理是二叉堆。
使用记得 #include<queue>

怎么用

初始化 priority_queue<类型, 容器,比较器>
类型: 要存储的数据类型
容器: 存储数据的底层容器,默认是vector, 写算法题就保持默认就行了
比较器: 默认是less<类型> 类型 可以自定义 默认的话就是初始了一个大顶堆 堆顶元素最大

综上,写算法题常见的两种初始化方式如下

priority_queue<int> que; // 默认的 只写类型就行了 大顶堆
priority_queue<int,vector<int>,greater<int>> que // 自定义的就要全都写上  小顶堆

常用操作

que.push(1) // 进堆
que.pop() // 出堆
que.top() // 取堆顶
que.size // 队列大小
que.empty();  // 判空

注意:

  1. 不能遍历 不能取里面的某一个元素 只能取堆顶元素

set

是什么

提供对数时间的插入、删除、查找的集合数据结构。底层原理是红黑树。
还可以去重 有的时候去重会用他
一共有三种set

分别是:

set: 去重 有序(从小到大)
multiset: 不去重 有序(从小到大)
unordered_set: 去重 无序

怎么用

初始化 set<类型,比较器> st
比较器默认是 less<类型> 也就是从小到大

所以有下面两种初始化的方式

set<int> st // 从小到大
set<int,greater<int>> st // 从大到小

常用方法:

st.insert() // 插入元素
st.erase()  // 删除元素
st.find()  // 查找元素   返回的是一个迭代器 如果元素存在 返回指向这个元素的迭代器 不存在就返回末尾的迭代器
auto it = st.find() 
cout << *it << endl  // 要这么用 才能拿到查找的这个元素

st.count()  // 查找元素存在不存在  返回1就是存在
// size() clear() empty() 均存在

他是可以遍历的!!

// 方法1  用迭代器遍历
for(set<int>::iterator it = st.begin(); it != st.end(); ++it) 
for(auto it = st.begin(); it != st.end(); ++it) 
//方法2   增强for循环
for(auto x : st)

注意:

  1. 虽然可以遍历 但是不能用下标访问数据
  2. 遍历的时候只能读 不能修改元素
  3. 迭代器不能像vector一样相减直接得到下标

map

是什么

提供对数时间的有序键值对结构。底层原理是红黑树。

有三种比较常用
map: 键去重 键有序(从小到大)
multimap: 键不去重 键有序(从小到大)
unordered_map: 键去重 键无序

怎么用

初始化:

map<int,int> mp // 键从小到大
map<int,int,greater> mp // 键从大到小

三种遍历和取值方法

// 迭代器
for(auto it = mp.begin(); it != mp.end(); ++it)
    cout << it -> first << it -> second << endl
// 增强for循环
for(auto x: mp)
    cout << x.first << x.second << endl
//架构化绑定的增强for循环
for(auto x: mp)
    cout << x << v << endl

常用方法:

mp[1] = 2 // 增加新的键值对   修改已经有的
mp.find(元素) // 查找元素返回迭代器
mp.erase()
mp.count()
size    empty   clear 都有

注意:

  1. 如果使用中括号 访问map时对应的键不存在,那么就会新增这个键,设置为默认值, 所以中括号会影响键的存在性
  2. 不能像vector一样相减得到下标

以上就是我认为做算法题必须要掌握的容器知识啦QWQ

标签:arr,元素,C++,st,算法,vector,que,就够,100
From: https://www.cnblogs.com/nicebaoke/p/18365113

相关文章

  • 使用贝叶斯优化CDENCLUE聚类算法参数
    目录1.贝叶斯优化的基本原理原理和实现步骤:2.轮廓系数的原理公式:3.贝叶斯优化的实现流程(伪代码)1.贝叶斯优化的基本原理贝叶斯优化是一种基于概率模型的优化方法,主要用于优化计算代价高昂的黑盒函数。它结合了先验知识和观察到的数据来更新后验知识,并用一个易......
  • 【C++小白到大牛】红黑树那些事儿
    目录前言:一、红黑树的概念二、红黑树的性质三、红黑树结点的定义四、红黑树的插入情况一:u存在且为红情况二:u不存在/u存在且为黑小总结:原码:五、红黑树的检验六、性能比较前言:我们之前已经学过了二叉搜索树的优化版——AVL树,这次我们来学习二叉搜索树的另外一种优......
  • 成绩排序—————c++
    先看问题:成绩排序时间限制:C/C++1000MS,其他语言2000MS内存限制:C/C++256MB,其他语言512MB难度:普及-分数:100 OI排行榜得分:12(0.1*分数+2*难度)出题人:root描述给出班里某门课程的成绩单,请你按成绩从高到低对成绩单排序输出,如果有相同分数则名字字典序小的在前。输入......
  • C++输出
    Hello!Hi!这是我的第一个程序如何输出上面的文字?C++提供了一个函数——cout1|#include<iostream>2|3|intmain()4|{5|cout<<"Hello!";6|return0;7|}以上代码是cout的应用话说回来,如何实现文章开头的效果呢?你可能会用以下代码1|cout<<"Hello!";2|cout<......
  • 二分查找不理解?一篇弄懂!--基础二分查找算法详细解释(带简单例题的详细解法)
    本文参考:灵茶山艾府分享丨【题单】二分算法(二分答案/最小化最大值/最大化最小值/第K小)-力扣(LeetCode)二分查找红蓝染色法_哔哩哔哩_bilibili本文主要详细讲解基础的二分算法中的查找,包括原理和模板,并用leetcode和洛谷的一些例题来进行实际题目讲解,如果觉得有帮助或者写......
  • 以node / link文件表征的道路网络-----dijkstra算法yyds-----基于南京公路公开数据做
    前文已经基于公开数据,获得了南京的全域高速公路的路网数据,这些以node/link文件表征的道路网络不仅延续了osm地图中所包含的经纬度、名称、容量等信息,还包含了一个重要的道路等级字段“link_type_name”。交通部门一般以高速公路、国省干道、城市道路、乡道农路作为区分......
  • 二分查找(算法详解+模板+例题)
    一.二分的定义二分法(Bisectionmethod)即一分为二的方法.设[a,b]为R的闭区间.逐次二分法就是造出如下的区间序列([an,bn]):a0=a,b0=b,且对任一自然数n,[an+1,bn+1]或者等于[an,cn],或者等于[cn,bn],其中cn表示[an,bn]的中点。二.基本思路1.将数组排序。2.一直将数组除以二,直到找到那......
  • C++-练习-20
    题目:WilliamWingate从事披萨饼分析服务。对于每个披萨饼,它都需要记录下列信息:披萨饼从事公司的名称,可以有多个单词组成披萨饼的直径披萨饼的重量。请设计一个能够存储这些信息的结构,并编写一个使用这种结构变量的程序。程序将请求用户输入上述信息,然后显示这些信息。请......
  • 【C++进阶学习】第十三弹——C++智能指针的深入解析
    前言:在C++编程中,内存管理是至关重要的一个环节。传统的手动内存管理方式容易导致内存泄漏、悬挂指针等问题。为了解决这些问题,C++引入了智能指针。本文将详细讲解C++中智能指针的概念、种类、使用方法以及注意事项。目录一、引言二、智能指针的原理及目的2.1智能指针......
  • 数据结构与算法——BFS(广度优先搜索)
    算法介绍:广度优先搜索(Breadth-FirstSearch,简称BFS)是一种遍历或搜索树和图的算法,也称为宽度优先搜索,BFS算法从图的某个节点开始,依次对其所有相邻节点进行探索和遍历,然后再对这些相邻节点的相邻节点进行探索,直到遍历完所有的节点。BFS算法使用队列来辅助实现,将起始节点放入队列......