05.STLvector、list、stack、queue

STL标准模板库

standard template library

STL将原来常用的容器和操作进行封装,增加了C++的编码效率

容器

string #include

vector #include

list #include

stack #include

queue #include

set #include

map #include

迭代器

容器和算法之间的粘合剂,可以类比指针

算法

sort()

max_element()

min_element()

vector容器

1.vector数组基本操作

向量数组(动态数组)

底层是静态数组

没有给向量数组分配空间不能向里面输入值

下面代码错误,因为向量数组v还没有分配空间
会造成非法访问内存空间的段错误
void text1_01(){
    int n;cin>>n;
    vector<int> v;
    for(int i=0;i<=n;i++){
        cin>>v[i];
        //错误,因为向量数组v还没有分配空间
        //会造成非法访问内存空间的段错误
    }
    for(int i=0;i<=n;i++){
        cout<<v[i]<<" ";
    }
}

v.push_back()和v.pop_back()

v.push_back()方法是分配空间的同时插入数据
v.pop_back()方法删除数据后,它的size大小也跟着改变
#pragma once
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

void text1_01(){
    int n;cin>>n;
    vector<int> v;
    cout<<"大小:"<<v.size()<<endl;
    for(int i=0;i<n;i++){
        int x;cin>>x;
        v.push_back(x);//不但插入数据,而且还分配空间
    }
    for(int i=0;i<v.size();i++){
        cout<<v[i]<<" ";
    }
    cout<<endl;
    v.pop_back();
    cout<<"大小:"<<v.size()<<endl;
    for(int i=0;i<v.size();i++){
        cout<<v[i]<<" ";
    }
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.调用vector类的的构造函数,给动态数组分配空间

方法一:缺省参2,分配n个整形空间,默认初始化为0

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

void text1_01(){
    int n;cin>>n;
    vector<int> v(n+1);//分配n个int大小的空间,并且初始化为0
    for(int i=1;i<=n;i++){
        cout<<v[i]<<" ";
    }
    cout<<endl;
}

方法二:参二为val,分配n个整形空间,则全部初始化为val

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

void text1_01(){
    int n;cin>>n;
    vector<int> v(n+1,100);//分配n个int大小的空间,并且初始化为val
    for(int i=1;i<=n;i++){
        cout<<v[i]<<" ";
    }
    cout<<endl;
}

方法三:大括号分配空间和数据

#include<vector>
void text01(){
    vector<int> v={1,2,3,4,5,6,7,8,9,10};
}

3.打印方式

方法1:cout下标打印

void text1_01(){
    int n;cin>>n;
    vector<int> v(n+1,100);//分配n个int大小的空间,并且初始化为0
    for(int i=1;i<=v.size()-1;i++){
        cin>>v[i];
    }
    for(int i=1;i<=v.size()-1;i++){
        cout<<v[i]<<" ";
    }
    cout<<endl;
}

方法2:iterator(迭代器)打印

v.begin()是指向数组首元素的迭代器
v.end()是指向数组为元素下一位的迭代器,充当结束的标志(无效迭代器)
vector::iterator iter=v.begin()+1
auto iter=v.begin()+1
void text1_01(){
    int n;cin>>n;
    vector<int> v(n+1,100);//分配n个int大小的空间,并且初始化为0
    for(int i=1;i<=v.size()-1;i++){
        cin>>v[i];
    }
    //迭代器可以类比为指针类型
    //vector<int>::iterator iter=v.begin()+1;
    for(auto iter=v.begin()+1;iter!=v.end();iter++){
        cout<<*iter<<" ";
    }
    cout<<endl;
}

方法3:for range(C++11)访问

#include <vector>
vector<int> v={1,2,3,4,5,6,7,8,9,10};
void text01(){
    for(auto it:v){
        cout<<it<<" ";
    }
}

4.初始化和打印练习

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

void text2_01(){
    //vector<Type> v(count,val)-->申请count个Type大小的val
//    vector<int> v0;//没有分配空间
    int n;cin>>n;
    vector<int> v0;
    vector<int> v1{1,2,3,4,5,6,7,8,9,10};
    vector<int> v2(n);
    vector<int> v3(n,10);
    //内置函数push_back()分配空间的同时插入数据
    cout<<"输入vo:"<<endl;
    for(int i=0;i<n;i++){
        int x;cin>>x;
        v0.push_back(x);
    }
    cout<<"push_back输入的for range打印 vo:"<<endl;
    for(auto it:v0){
        cout<<it<<" ";
    }
    cout<<endl;
    cout<<"迭代器打印 v1:"<<endl;
    //迭代器打印
    for(auto iter=v1.begin();iter!=v1.end();iter++){
        cout<<*iter<<" ";
    }
    cout<<endl;
    cout<<"输入v2:"<<endl;
    for(auto& it:v2){
        cin>>it;
    }
    cout<<"for range打印 v2:"<<endl;
    //for range打印
    for(auto it:v2){
        cout<<it<<" ";
    }
    cout<<endl;
    //下标打印
    cout<<"下标打印 v3:"<<endl;
    for(int i=0;i<v3.size();i++){
        cout<<v3[i]<<" ";
    }
}

5.内置函数

v.erase()

v.insert()

STL中单反涉及迭代器区间的都是左闭右开

void text1_01(){
    vector<int> v{1,2,3,4,5,6,8,9,10};//分配n个int大小的空间,并且初始化为0
    //迭代器可以类比为指针类型
    //vector<int>::iterator iter=v.begin()+1;
    v.erase(v.begin());
    for(auto it:v){
        cout<<it<<" ";
    }
    cout<<endl;
    v.erase(v.begin(),v.begin()+5);
    for(auto it:v){
        cout<<it<<" ";
    }//8 9 10
    cout<<endl;
    v.insert(v.begin(),7);
    for(auto it:v){
        cout<<it<<" ";
    }
    cout<<endl;
}

v.at(i)的定位器和v[i]的区别

v.at(i)定位器如果越界的话会抛出异常
v[i]越界的话会报错
image-20240114003455840

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

void text1_01(){
    vector<int> v{1,2,3,4,5,6,8,9,10};//分配n个int大小的空间,并且初始化为0
    int i;cin>>i;
    cout<<v[i];
/*    cout<<v.at(i);*/
}

v.back();//输出数组的最后一位

v.size()

v.capacity()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

void text1_01(){
 vector<int> v{1,2,3,4,5,6,7,8,9,10};//分配n个int大小的空间,并且初始化为0
 v.erase(v.begin()+9);
 cout<<v.size()<<endl;
 cout<<v.capacity()<<endl;
}

6.外置函数sort()

参数有俩种形式 一种是 参一:首元素地址,参二:尾元素地址的下一位,参三:比较规则
另外一直是,参一:指向首元素的迭代器,参二:指向为元素下一位的迭代器,参三:比较规则

STL里面的容器元素使用sort排序必须穿迭代器,例如string、vector数组

但是非STL容器,sort排序可以不穿迭代器,例如string【】数组,int nums【】数组

string s="hello world";
bool cmp(int left,int right){
    return left>right;
}
void text1_01(){
    vector<int> v{1,2,3,4,5,6,7,8,9,10};//分配n个int大小的空间,并且初始化为0
    sort(v.begin(),v.end(),cmp);
    for(auto it:v){
        cout<<it<<" ";
    }
}
void text1_02(){
    sort(s.begin(),s.end());
    for(auto it:s){
        cout<<it;
    }
}

7.迭代器与反迭代器

image-20240114010436217

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

void text1_01(){
    vector<int> v{5,1,3,2,6,8,1,23,4,9};//分配n个int大小的空间,并且初始化为0
    sort(v.begin(),v.end());
    for(auto it:v){
        cout<<it<<" ";
    }
    cout<<endl;
    sort(v.rbegin(),v.rend());
    for(auto it:v){
        cout<<it<<" ";
    }
}

list容器

0.底层是双向链表

1.基本操作ls.push_back()和ls.pop_back()

2.利用构造函数开辟空间和{ }直接赋值开辟空间

3.打印方式(for range打印、迭代器打印)

4.内置函数

ls.erase、ls.insert、ls.size()、ls.begin()、ls.end()

ls.push_back、ls.push_front()、ls.pop_back()、ls.pop_front()

5.外置函数(list容器没有外置sort函数)

因为即使传入了begin end 迭代器,但是链表是不连续的,所以无法完成排序

bool cmp(int left,int right){
    return left>right;
}
void text2_01(){
    list<int> ls{5,4,3,2,1,6,7,8,9,10};
//    sort(ls.begin(),ls.end());
//    ls.sort();
//    for(auto it:ls){
//        cout<<it<<" ";
//    }
    ls.sort(cmp);
    for(auto it:ls){
        cout<<it<<" ";
    }
    cout<<endl;
    ls.pop_front();
    ls.push_front(11);
    for(auto it:ls){
        cout<<it<<" ";
    }
    cout<<endl;
}

但是有内置sort函数,内置的不用传迭代器

bool cmp(int left,int right){
    return left>right;
}
void text2_01(){
    list<int> ls{5,4,3,2,1,6,7,8,9,10};
//    sort(ls.begin(),ls.end());
//    ls.sort();
//    for(auto it:ls){
//        cout<<it<<" ";
//    }
    ls.sort(cmp);
    for(auto it:ls){
        cout<<it<<" ";
    }
    cout<<endl;
}
void text2_01(){
    list<int> ls{5,4,3,2,1,6,7,8,9,10};
    auto p=ls.begin();
    int key;cin>>key;
    while(*p!=key){
        p++;
    }
    ls.erase(p);
    for(auto it:ls){
        cout<<it<<" ";
    }
    cout<<endl;
    ls.insert(ls.end(),1);
    for(auto it:ls){
        cout<<it<<" ";
    }
//    sort(ls.rbegin(),ls.rend());
//    sort(ls.begin(),ls.end());
//    int n;cin>>n;
//    list<int> ls(n,10);
//    for(auto it:ls){
//        cout<<it<<" ";
//    }
//    for(int i=1;i<=n;i++){
//        int x;cin>>x;
//        ls.push_back(x);
//    }
//    for(auto it:ls){
//        cout<<it<<" ";
//    }
//    cout<<endl;
//    ls.pop_back();
//    cout<<"for range打印"<<endl;
//    for(auto it:ls){
//        cout<<it<<" ";
//    }
//    cout<<endl;
//    cout<<"迭代器打印"<<endl;
    iter++<-->iter=iter->next
//    for(auto iter=ls.begin();iter!=ls.end();iter++){
//        cout<<*iter<<" ";
//    }
}

stack容器

后进先出,先进后厨,LIFO

1.stk.push()

2.stk.pop()

3.stk.empty()

4.stk.top()

void text2_01(){
    stack<int> stk;
    stk.push(1);stk.push(2);stk.push(3);stk.push(4);
    while(!stk.empty()){
        cout<<stk.top()<<" ";
        stk.pop();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/402058.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

js 多对象去重(多属性去重)

需求中发现后端可能没有处理重复数据&#xff0c;这个时候前段可以直接解决。 在 JavaScript 中&#xff0c;可以使用 Set 数据结构来进行多对象的去重。Set 是 ES6 新引入的集合类型&#xff0c;其特点是元素不会重复且无序。 下面是一个示例代码&#xff0c;展示如何通过 S…

Nginx----高性能的WEB服务端

一、Nginx介绍 1、什么是Nginx Nginx Nginx是一个高性能的HTTP和反向代理服务器。是一款轻量级的高性能的web服务器/反向代理服务器/电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器&#xff0c;单台物理服务器可支持30 000&#xff5e;50 000个并发请求。 一款高性能…

一分钟学会MobaXterm当Linux客户端使用

一、介绍 MobaXterm是一款功能强大的远程计算机管理工具&#xff0c;它集成了各种网络工具和远程连接协议&#xff0c;可以帮助用户在Windows系统上轻松管理远程计算机。MobaXterm支持SSH、Telnet、RDP、VNC等多种远程连接协议&#xff0c;同时还集成了X11服务器&#xff0c;可…

启动node服务报错Error: listen EACCES: permission denied 0.0.0.0:5000

启动node服务报错&#xff1a; 解决方案&#xff1a; 将监听端口改成3000或者其他 修改后结果&#xff1a; 参考原文&#xff1a; Error: listen EACCES: permission denied_error when starting dev server: error: listen eacc-CSDN博客

并发编程入门指南

文章目录 并发编程进程和线程的区别并发和并行的区别创建线程的方式线程之间的状态&#xff0c;状态之间的转换新建三个线程&#xff0c;如何保证按顺序执行wait方法和sleep的区别如何停止一个正在运行的线程synchronized关键字底层原理Monitor属于重量级锁&#xff0c;了解过锁…

外贸邮件群发软件有效果吗?邮件群发平台?

外贸邮件群发软件怎么选&#xff1f;国外邮箱群发平台如何选择&#xff1f; 外贸业务已成为许多企业发展的重要方向。在这个过程中&#xff0c;各种工具和技术层出不穷&#xff0c;其中外贸邮件群发软件因其能够高效、批量地发送邮件而备受关注。那么&#xff0c;外贸邮件群发…

API接口测试工具的使用指南

API接口测试是确保软件系统正常运作的关键步骤。API接口测试工具可以帮助开发人员和测试人员验证API的功能、性能和安全性。本文将介绍API接口测试工具的基本使用方法&#xff0c;以便有效地进行接口测试。 1. 选择合适的API测试工具 在开始API接口测试之前&#xff0c;首先需要…

STM32F10X(Cortex-M3)系统定时器寄存器笔记和系统定时器精准延时函数

Cortex-M3系统定时器寄存器笔记和系统定时器精准延时函数 简介系统定时器寄存器STK_CTRLSTK_LOADSTK_VALSTK_CALIB STM32F10X(Cortex-M3)精准延时函数 简介 在STM32F10X(Cortex-M3)除了通用定时器和看门狗定时器外&#xff0c;还有一个系统定时器(SysTick) 拿STM32F103C8T6来说…

vue如何动态加载显示本地图片资源

在实际开发中&#xff0c;根据某一个变量动态展示图片的情况有很多。实现方法分打包构建工具的差异而不同。 1、webpack的项目 require引入图片资源 2、vite的项目 new URL(url,base).href 疑问解答&#xff1a;为什么vite项目不可以用require&#xff1f; 原因在于&#xf…

vue项目设置的端口号运行后会自动加一问题解决

vue项目设置的端口号运行后会自动加一问题解决 主要原因是之前运行项目后没有完全的关闭服务&#xff0c;导致再次运行项目端口号被占用&#xff0c;自动加一&#xff01; 问题解决 打开任务管理器&#xff0c;在进程中找到node相关进程&#xff0c;右键结束任务

长期有效的文本二维码怎么生成?将文字做成二维码只需3步

现在经常会在扫描二维码的时候&#xff0c;发现很多的二维码种会展现文字的内容&#xff0c;比如常见的有物品信息、个人信息、信件等等。通过生成二维码的方式&#xff0c;来让其他人扫码获取内容&#xff0c;这种方式可以有效地降低成本&#xff0c;而且获取内容的方式也更加…

HDFS中常用的Shell命令 全面且详细

HDFS中常用的Shell命令目录 一、ls命令 二、mkdir 命令 三、put命令 四、get命令 五、mv命令 六、rm命令 七、cp命令 八、cat命令 前言 安装好hadoop环境之后&#xff0c;可以执行hdfs相关的shell命令对hdfs文件系统进行操作&#xff0c;比如文件的创建、删除、修改文…

企微hook框架

https://wwm.lanzoum.com/ipUTp1ot1twh 密码:hvev 免费的企微框架 支持文本消息&#xff0c;图片消息&#xff0c;视频消息&#xff0c;文件消息。 其他可自行下载测试。 有兴趣可以进群交流。720192224 BOOL WxWorkSendData(string data) { WX_GETOBJDATA ob…

Linux课程三课---Linux开发环境的使用(yum的相关)

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

前端基础自学整理|HTML + JavaScript + DOM事件

目录 一、HTML 1、Html标签 2、Html元素 3、基本的HTML标签 二、CSS 样式 层叠样式表 三、JavaScript 使用示例 四、HTML DOM 通过可编程的对象模型&#xff0c;javaScript可以&#xff1a; window document 1、查找HTML元素 2、操作HTML元素 获取元素的属性 四…

基于Java jsp+mysql+Spring的汽车出租平台租赁网站平台设计和实现

基于Java jspmysqlSpring的汽车出租平台租赁网站平台设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留…

使用JDBC操作数据库(IDEA编译器)

目录 JDBC的本质 ​ JDBC好处 JDBC操作MySQL数据库 1.创建工程导入驱动jar包 2.编写测试代码 ​相关问题 JDBC的本质 官方(sun公司) 定义的一套操作所有关系型数据库的规则&#xff0c;即接口各个数据库厂商去实现这套接口&#xff0c;提供数据库驱动jar包我们可以使用这…

【数据库】达梦数据库DM8开发版安装

目录 一、达梦数据库概述 1.1 达梦数据库简介 1.2 产品特性 1.3 产品架构 二、安装前准备 2.1 新建 dmdba 用户 2.2 修改文件打开最大数 2.3 挂载镜像 2.4 新建安装目录 2.5 修改安装目录权限 三、数据库安装 3.1 命令行安装 3.2 配置环境变量 四、配置实例 4.1…

离散数学(一) 集合

属于关系 表示 枚举法; 叙述法; 文氏图法 基数 空集 全集 全集是相对唯一的

LaunchPad 市场的复苏,Penpad 成新兴生力军

以 Fair Launch 为主要启动方式的铭文市场的爆发&#xff0c;推动了 LaunchPad 市场的复苏&#xff0c;绝多数所铭文项目都能通过 Fairr Launch 的方式筹集资金实现启动&#xff0c;该赛道的爆发不仅推动了数百亿美元的热钱开始在链上不断涌动&#xff0c;同时也进一步形成了新…