当前位置: 首页 > news >正文

STL容器

目录

一、vector

1、概念

2、基本用法

二、set

1、概念

2、set构建

3、基本用法

4、set 和 vector 的对比

三、map

1、插入、输出

2、find()查找

四、deque

 五、stack栈


注:STL会学到迭代器,可以理解为指针

一、迭代器

下面以vector类型为例。

vector<int>  v;

1.1 正向遍历

for(vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}

1.2 逆向遍历

类型:vector<int>::reverse_iterator

开始:rbegin()

结尾:rend()

for(vector<int>::reverse_iterator it = v.rbegin(); it != v.rend(); it++){cout << *it << " ";
}

1.3 auto遍历

for(auto i : v) cout << i << " ";

二、vector  动态数组

1、概念

头文件:#include<vector>

类似于数组。删除某个元素时,后面的元素自动往前移动

数据类型可以为:int、double、char、结构体等

2、基本用法

    vector<int> v;  //一维 vector<int> v[20]; //二维vector<int> v{1,2,3,4,5}; //直接使用花括号赋值vector<int> v(5); //初始化5个值为0的元素vector<int> v(5, 4); //初始化5个值为4的元素v.push_back(10);//在末尾插入10v.pop_back(); //删除末尾一个元素 v.insert(位置,元素); //插入元素v.insert(v.begin()+2,5) //在v[2]号位置插入5 v.size(); //获取容器长度(元素个数)v.clear(); //清空容器v.erase(v.begin()+3); //删除3号位元素,后面的元素自动往前移 v.erase(v.begin()+1,v.begin()+3); //删除 1、2号位 //v.erase(3);  //错误写法//加头文件 #include<algorithm>reverse(v.begin(), v.end());sort(v.begin(), v.end());//输出:两种写法for(auto i : v) cout << i << " ";for(vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}//交换两个vectorv1.swap(v2);

三、set(主要用于:去重和排序)

5.1 概念

头文件:#include<set>

set只存value,但底层是以键值对的形式存储<键,值>,键是唯一的。set中的元素不能在容器中修改(元素总是 const 类型),但是可以从容器中插入或者删除它们。

它的查找速度极快,常用来存储各种经常被检索的数据,因为容器的底层是平衡二叉搜索树中的红黑树

注意点总结:

  • set 中 插入元素时,只需要插入 value 即可,不需要构造键值对
  • set 中的元素不可以重复(因此可以使用 set 去重
  • set 中的元素默认按照 升序 来排序
  • set 中的元素不允许修改

5.2 set构建

set<int> s1; // 构造一个int类型的空容器set<int> s2(s1); // 拷贝构造int类型s1容器的复制品vector<int> v1 = { 1,2,3,4,5 };
set<int> s3(v1.begin(), v1.end()); // 构造vector对象某段区间的复制品

5.3 基本用法

	set<int> s={1,2,5,7,22,55};s.insert(4); //插入数字4 set<int>::iterator pos = s.find(5); //返回5的下标。如找不到返回最后一个元素的下一个位置下标 //auto pos=s.find(5)  //可写成这样子cout<<pos; //输出位置 cout<<*pos;  //输出值 s.erase(pos); //删除pos位置的值  若无该值会报错 s.erase(22); //删除数字22   无该值不会报错 s.erase(迭代器1,迭代器2);//e.erase(pos,s.end()); //删除pos至结尾 s.swap(s1);//  交换 set 容器中的元素 s.empty(); //判断是否为空,是1,否0s.size();  // 返回 set 中的有效元素个数s.count(x) //  返回 set 中值为 x 的元素的个数auto low=s.lower_bound(3);//如果s存在3就返回3位置的迭代器。否则返回比3大的值的迭代器auto up=s.upper_bound(3); //不管val存在还是不存在,都返回比val大的那个值//输出 for(auto i:s)cout<<i<<" "; //交换两个sets1.swap(s2);
#include<iostream>
#include<set>
using namespace std;int main(){set<int> s={1,2,3,4};// 插入元素s.insert(1);s.insert(2);s.insert(4);s.insert(5);s.insert(9);//输出cout<<"初始set: ";for(auto i:s)cout<<i<<" ";cout<<endl;//删除s.erase(9);cout<<"删除数字9: "; for(auto i:s)cout<<i<<" ";cout<<endl;cout<<"元素个数:"<<s.size()<<endl;	return 0;
}

5.4 set 和 vector 的对比

vector 是一个动态数组,它允许存储重复的元素,且元素存储的顺序是按插入顺序排列

set 是一个集合,它自动去重并保持元素的有序性

set不能使用*(it+1)指向下一个元素

四、map  字典

容器中的每个存储对为一个键值对,包含两个元素(键和值)。和python字典一样。

c++中的map会自动根据first值排序。

4.1 插入、输出

#include <iostream>
#include <map>
using namespace std;int main(){//map<数据类型,数据类型> 变量;map<string,int> m;//插入-------------------//1m["数学"]=98;m["语文"]=100;//2//m.insert(pair<数据类型,数据类型>(数据1,数据2))m.insert(pair<string,int>("政治",89)); //3m.insert(make_pair("化学",98));//4 m.insert({"英语",98});cout<<m["数学"]<<endl<<endl; //遍历访问 -------------------//1for(map<string,int>::iterator it=m.begin();it!=m.end(); it++) {cout<<it->first<<" "<<it->second<<endl;}//2for(auto i:m){cout<<i.first<<" "<< i.second<<endl;//键,值}}

4.2 find()查找

返回找元素的位置,否则返回end()位置

it = m.find("123");if(it != m.end())cout<<"存在"<<it->second<<endl;
elsecout<<"不存在"<<endl;

五、queue  队列

#include <deque>

头文件queue主要包括循环队列queue和优先队列priority_queue两个容器。

queue容器:相当于队列,满足先进先出的原则,即队尾出、队首进。

priority_queue容器:相当于大根堆(或者小根堆),大根堆每次堆顶是最大元素,小根堆每次堆顶是最小元素。

5.1  queue

#include<queue>//生成
queue<数据类型> q;
queue<int> q;// 访问队头队尾
q.front(); //队头
q.back();  //队尾//插入
q.push(数据); //尾插入//删除
q.pop(); //删队头//容量
q.size(); //多少个元素//判空 ,空返回true,否则返回false 
q.empty()// 清空
q.clear();

5.2  priority_queue 

//priority_queue 
priority_queue<int> q; //大根堆
priority_queue<int,vector<int>,less<int>> q; //大根堆
priority_queue<int, vector<int>, greater<int>> q; //小根堆//priority_queue 插入
q.push(数据); //把一个元素插入堆 //priority_queue 删除
q.pop(); //删除堆顶的元素 //priority_queue 堆顶
q.top(); //返回堆顶元素 //priority_queue 容量
q.size();//priority_queue 判空
q.empty()  //空返回true,否则返回false 

 六、dequeue

 双端队列deque是一个支持在两端高效插入或删除元素的连续线性存储空间。它就像是vector和queue的结合。与vector相比,deque在头部增删元素仅需要 O(1)的时间;与queue相比,deque像数组一样支持随机访问。

#include <deque>//dequeue 定义 
dequeue<数据类型> dq;
dequeue<int> dq;//dequeue 头尾
dq.front();
dq.back();//dequeue 迭代器
dq.begin() 
dq.end()//dequeue 插入
dq.push_front(数据); //头插入 
dq.push_back(数据); //尾插入 //dequeue 删除
dq.pop_front(); //头删除 
dq.pop_back(); //尾删除 //dequeue 容量
dq.size();//dequeue 判空
dq.empty()//dequeue 清空
dq.clear();

 七、stack  栈

#include <stack>

//stack 生成
stack<数据类型> sk;
stack<int> sk;//stack 插入
sk.push(数据); //把一个元素放入栈 //stack 删除
sk.pop(); //删除栈顶的元素 //stack 栈顶
sk.top(); //返回栈顶元素 //stack 容量
sk.size();//stack 判空,空返回true,否则返回false 
sk.empty()

      http://www.dtcms.com/a/614949.html

      相关文章:

    • 北京网站建设企业网站制作益阳seo网站建设
    • 天猫网站建设目的小学最好的网站建设
    • JavaWeb(前端实战)
    • 新网站多久收录内页4399任天堂
    • 买网站做网站设计怎么学
    • Qt Core 模块中的函数详解
    • 网站备案检验单网站搭建免费
    • 设置网站模板免费的app软件下载安装
    • 滁州 来安县建设局网站建设局是做什么的
    • 异常的介绍
    • [LivePortrait] LivePortraitPipeline
    • 织梦wap网站模版wordpress的注册文件在哪儿
    • 汝州住房和城乡建设局新网站网站编辑做多久可以升职
    • 做淘宝网站宝安中心区
    • 36_FastMCP 2.x 中文文档之FastMCP客户端高级功能:接收并处理服务端进度报告详解
    • 手机网站 制作技术百度seo官网
    • 上海个人网站建做的最好的紫砂网站
    • 前端工程化面试题
    • 武安市网站建设费用成都网站建设_创新互联
    • 关于 mariadb开源数据库忘记密码 的解决方法
    • [优选算法专题七.分治-快排 ——NO.42~44 颜色分类、排序数组、数组中的第K个最大元素]
    • 2025云安全渗透:如何拿下一台云主机-附加复现实验加原理(全网独一份小白必看)
    • 网站优化公司收费我要注册公司怎么办
    • 傻瓜式网站制作互动网站的核心技术
    • 拓扑排序-java实现
    • 有什么做海报网站ps网页设计作品欣赏
    • 外贸网站建设收款通道崇左网站建设公司
    • 学校部门网站建设WordPress如何添加cnzz
    • ThinkPad 电脑热键修复(静音常亮导致电脑无声音 )
    • 网站数据库怎么做同步吗学院网站模板