05.STLvector、list、stack、queue

news2024/11/16 1:58:12

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();
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【海贼王的数据航海:利用数据结构成为数据海洋的霸主】时间复杂度 | 空间复杂度

目录 1 -> 算法效率 1.1 -> 如何衡量一个算法的好坏&#xff1f; 1.2 -> 算法的复杂度 2 -> 时间复杂度 2.1 -> 时间复杂度的概念 2.2 -> 大O的渐进表示法 2.3 -> 常见时间复杂度计算 3 -> 空间复杂度 4 -> 常见复杂度对比 1 -> 算法效…

数字化转型导师坚鹏:数字政府技术、业务、数据融合发展路径探索

数字政府建设与发展研究 ——技术、业务、数据融合发展路径探索 课程背景&#xff1a; 很多政府存在以下问题&#xff1a; 不清楚数字政府建设内涵 不清楚数字政府建设现状 不清楚数字政府融合路径 课程特色&#xff1a; 有实战案例 有原创观点 有精彩解读 学…

来分析两道小题

一、源码 二、分析 首先它会接两个参数一个是id一个是ps&#xff0c;传递的话会包含一个flag.php&#xff0c;然后数据库连接&#xff0c;之后传递过滤&#xff0c;然后查询&#xff0c;如果查到了就会取id&#xff0c;取出来看是不是跟adog一样&#xff0c;如果是它告诉你账号…

Imagewheel私人图床搭建结合内网穿透实现无公网IP远程访问教程

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

四年功能测试,测试工作吐槽

这篇文章基于中小公司的工作经验&#xff0c;中小厂的测试流程往往没有大厂那么规范&#xff0c;也会遇到很多挑战&#xff0c;来看下他是怎么解决的 问题一&#xff1a;测试时间评估 这是一个工作日常经常需要回复的问题&#xff0c;理论上 测试这边要做出较科学合理的回复&…

Flutter学习4 - Dart数据类型

1、基本数据类型 num、int、double &#xff08;1&#xff09;常用数据类型 num类型&#xff0c;是数字类型的父类型&#xff0c;有两个子类 int 和 double 通过在函数名前加下划线&#xff0c;可以将函数变成私有函数&#xff0c;私有函数只能在当前文件中调用 //常用数据…

2024 财源(裁员)广进(鸿蒙开发岗)~

2023已过去了&#xff0c;2024大家都在期待经济复苏起来&#xff0c;但并没有起来&#xff0c;倒是第一波 “裁员潮”突然来袭&#xff1a; 这一波突然袭击&#xff0c;使得一些年后想换工作的人不敢轮乱动了&#xff0c;真不知道哪一天起床就失业了 今年我已经接到了太多粉丝…

力扣OJ题——随机链表的复制

题目&#xff1a; 138. 随机链表的复制 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 要求&#xff1a;构造这个链表的 深拷贝 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中…

LabVIEW多通道压力传感器实时动态检测

LabVIEW多通道压力传感器实时动态检测 介绍了一种基于LabVIEW的多通道压力传感器实时动态检测系统&#xff0c;解决压阻式压力传感器温度补偿过程的复杂度&#xff0c;提高测量的准确性。通过自动轮询检测方法&#xff0c;结合硬件检测模型和多通道检测系统设计&#xff0c;本…

【动态规划专栏】专题三:简单多状态dp--------3.删除并获得点数

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

ios抓包Tunnel to......443

fiddler官网下载“CertMaker for iOS and Android”插件&#xff0c;官网插件&#xff1a;https://www.telerik.com/fiddler/add-ons 双击运行插件后&#xff0c;重启fiddler&#xff0c;ios重新安装证书即可

九州金榜|家庭教育小技巧

家庭教育对于孩子的发展至关重要&#xff0c;家长一定要重视孩子在家里的举动&#xff0c;同样孩子犯错&#xff0c;对于孩子批评也是有一定技巧&#xff0c;下面九州金榜家庭教育给大家分享一下关于在家庭教育中的一些小技巧&#xff0c;帮助大家怎样在家庭教育中面对孩子 1、…

字节一面 : post为什么会发送两次请求?

同源策略 在浏览器中&#xff0c;内容是很开放的&#xff0c;任何资源都可以接入其中&#xff0c;如 JavaScript 文件、图片、音频、视频等资源&#xff0c;甚至可以下载其他站点的可执行文件。 但也不是说浏览器就是完全自由的&#xff0c;如果不加以控制&#xff0c;就会出…

DPDK应该如何入门学习?

01 写在前面 我的读者当中应该有一部分人是做 DPDK 相关的&#xff0c;我自己虽然现在已经不做 DPDK 了&#xff0c;但对这块仍然有兴趣&#xff0c;今天这篇文章就来总结下 DPDK 的技术栈。注意&#xff1a;这篇文章是小白文&#xff0c;不适合大神哦。 文章从 DPDK 的产生背…

四.QT5工具安装和环境变量的配置

1.以管理员身份运行安装包 2.登录qt账号&#xff0c;点击【next】 3.选中同意 4.选择安装目录&#xff0c;注意不能有中文和空格 5.勾选 64位 mingw。点击【next】&#xff0c;等待安装完成 6.配置环境变量

QT基本组件

四、基本组件 Designer 设计师&#xff08;重点&#xff09; Qt包含了一个Designer程序&#xff0c;用于通过可视化界面设计开发界面&#xff0c;保存文件格式为.ui&#xff08;界面文件&#xff09;。界面文件内部使用xml语法的标签式语言。 在Qt Creator中创建文件时&#xf…

Java面向对象案例之家禽对象Poultry(3)

类主要结构图 抽象类&#xff1a;Poultry&#xff08;家禽作为父类&#xff09;子类&#xff1a;Chook&#xff08;鸡类&#xff09;、Duck&#xff08;鸭子类&#xff09;测试类&#xff1a;PoultryTest 类的方法图 代码示例 /*** 测试类*/ public class PoultryTest {public…

【STM32学习】——续上:软件SPI读写W25Q64SPI通信外设硬件SPI读写W25Q64

四、软件SPI读写W25Q64 工程思路与I2C类似&#xff0c;MySPI.c是通信底层&#xff0c;主要包括通信引脚封装、初始化、SPI通信的三个拼图&#xff08;起始、终止和交换一个字节&#xff09;&#xff1b;基于此文件建立W25Q64.c&#xff0c;调用MySPI三个拼图&#xff0c;拼接成…

Jmeter内置变量 vars 和props的使用详解

JMeter是一个功能强大的负载测试工具&#xff0c;它提供了许多有用的内置变量来支持测试过程。其中最常用的变量是 vars 和 props。 vars 变量 vars 变量是线程本地变量&#xff0c;它们只能在同一线程组内的所有线程中使用&#xff08;线程组内不同线程之间变量不共享&#…

(十二)【Jmeter】线程(Threads(Users))之setUp 线程组

简述 操作路径如下: 作用:在正式测试开始前执行预加载或预热操作,为测试做准备。配置:设置预加载或预热操作的采样器、循环次数等参数。使用场景:确保在正式测试开始前应用程序已经达到稳定状态,减少测试结果的偏差。优点:提供预加载或预热操作,确保测试的准确性。缺…