C++STL模板库

类:

pair:

头文件:<utility>

定义:

是一个标准库类型。可以看作是有两个成员变量first和second的结构体,并且重载了<运算符(先比较first大小,再比较second大小)当我们创建一个pair时,必须提供两个类型

创建一个pair:pair<string,int> p

函数返回:make_pair(v1,v2)

函数返回由v1,v2初始化的pair,类型可以从v1,v2的类型推断出来

动态数组:(数组的下标从0开始)

头文件:<vector>

定义一个动态数组:vector<int> a

插入元素:a.push_back()

获取长度:a.size()

删除元素:a.pop_back()(只能在末端操作)

迭代器:

std: :vector<int>: :inerator it //it只能读写vector<int>的元素

std: :vector<int>: :const_inerator it //it只能读vector<int>的元素,不可以修改vector<int>中的元素

for( it = vector.begin(); it != vector.end(); it++ )cout<<*it<<endl;
 for( std::vector<int>::reverse_iterator it = v.rbegin(); it!=v.rend();it++ )cout<<*it<<endl;

清空:clear()

只会清空数据,不会清空内存

#include<iostream>
using namespace std;
int main(){vector<int> a;//[]//插入元素a.push_back(1);//[1]a.push_back(2);//[1,2]a.push_back(3);//[1,2,3]//获取长度for(int i=0;i<a.size();i++){cout<<a[i]<<endl;}//修改元素a[0]=2;//[2,2,3]//删除元素a.pop_back();//[2,2]a.pop_back();//[2]return 0;
}

高级用法:

动态数组不仅仅可以存储基本的数据类型,还能存储自定义数据类型,比如结构体

#include<iostream>
#include<vector>
using namespace std;
struct student{string name;int age;
};
int main(){vector<student> class1;//创建动态数组:班级 student stu1,stu2;//学生1,学生2 stu1.name="小明";stu1.age=13;stu2.name="小红";stu2.age=14;//将两个学生导入到班级数组里面去 class1.push_back(stu1);class1.push_back(stu2);for(int i=0;i<class1.size();i++){cout<<"第"<<i+1<<"名学生:";cout<<"姓名:"<<class1[i].name<<endl;cout<<"年龄:"<<class1[i].age<<endl;}return 0;
} 

构造函数:

批量初始化:vector<int> a(初始化动态数组的长度,初始的数组里面每个元素的值)

#include<iostream>
#include<vector>
using namespace std;
int n=10;
vector<int> a(n,1);
int main(){for(int i=0;i<a.size();i++){cout<<a[i]<<endl;}return 0;
} 

二维动态数组:vector <vector<int> > vec2

注意:<int> >中间有一个空格,这个空格一定要加上,否则在一些老版本的编译器上不能通过编译
#include<iostream>
#include<vector>
using namespace std;
int n=5;
vector<vector<int> > a;
int main(){for(int i=0;i<n;i++){vector<int> x(i+1,1);a.push_back(x); }	for(int i=0;i<n;i++){for(int j=0;j<a[i].size();j++){cout<<a[i][j]<<" ";}cout<<endl;}/*11 11 1 11 1 1 11 1 1 1 1*/return 0;
} 

二维动态数组的每一维长度都可以不一样,可以是任意形状的。借助构造函数,我们可以快速的构造一个n行m列的动态数组,每个元素的初始值为0:vector<vector<int> > vec2(n,vector<int>(m,0))

#include<iostream>
#include<vector>
using namespace std;
//定义一个n行m列的二维动态数组 
//先要初始化,不能为空的时候使用 
int n=10,m=5;
vector<vector<int> >vec2(n,vector<int>(m,0));
int main(){return 0;
}

#include<iostream>
#include<vector>
using namespace std;
vector<vector<int> > v2d; 
int main(){for(int i=0;i<5;i++){v2d.push_back(vector<int>());}for(int i=0;i<v2d.size();i++){for(int j=0;j<=i;j++){v2d[i].push_back((i+1)*(j+1));}}for(int i=0;i<v2d.size();i++){for(int j=0;j<=i;j++){cout<<i+1<<"*"<<j+1<<"="<<v2d[i][j]<<" ";}cout<<endl;}return 0;
/*
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
*/
} 

集合set:(去除重复)

头文件:<set>

定义一个集合:set<string> a

插入元素:a.insert(" ")

删除元素:erase()

获取元素个数:size()

清空:clear()

clear()会帮忙清空集合,同时也会清空set所占的内存

判断元素是否存在:count()

如果集合中存在我们要查找的元素,返回1,否则会返回0

#include<iostream>
#include<set>
#include<string>
using namespace std;
set<string> a;
int main(){a.insert("China");//{"China"}a.insert("America");//{"Chinea","America"}a.insert("France");//{"China","America","France"} if(a.count("China")){cout<<"China belong to a"<<endl; }return 0;
}

迭代器:set<string>: :iteratoe it

#include<iostream>
#include<set>
#include<string>
using namespace std;
set<string> country;
int main(){country.insert("China");//{"China"}country.insert("America");//{"Chinea","America"}country.insert("France");//{"China","America","France"} //声明一个迭代器  set<string>::iterator it;for(it=country.begin();it!=country.end();it++){cout<<*it<<" ";} cout<<endl;return 0;
}

运算符重载(重新定义小于符号):operator<

set经常会配合结构体来使用,用set来存储结构体和vector有些区别。正如我们前面所说,set是需要经过排序的。系统自带的数据类型有默认的比较大小的规则,而我们自定义的结构体,系统是不可能知道这个结构体比较大小的方式的。所以我们需要用一种方式来告诉系统怎么比较这个结构体的大小。

#include<iostream>
#include<set>
#include<string> 
using namespace std;
struct a{int x,y;bool operator<(const a&rhs) const{   //operator< 为运算符重载 if(x==a.x){return y<rhs.y;}else{return x<rhs.x;}}//这里规定的排序方式为,优先按照x从小到大排序,如果x相同,再按照y从大到小排序。//经过了<运算符重载的结构体,我们就可以比较两个Node对象的大小了,因此可以直接存储在set里 
};
int main(){return 0;
}

#include<iostream>
#include<set>
#include<string>
using namespace std;
struct Point{   //创建一个结构体int x, y;bool operator<(const Point&rhs) const{  //进行运算符重载if(x==rhs.x){      //如果x相同则对y进行排序return y<rhs.y;}else{return x<rhs.x;   //x小的排在前面}}
};
set<Point> v;    //定义一个结构体类型的集合v
int main(){int n;cin>>n;for(int i=0;i<n;i++){Point temp;cin>>temp.x>>temp.y ;v.insert(temp); }for(set<Point>::iterator it=v.begin();it!=v.end();it++){ //迭代器进行遍历我们的集合cout<<it->x<<" "<<it->y<<endl;     //->为指针的用法}return 0;
} 

注意:

1.如果集合中已经存在了某个元素,再次插入不会产生任何效果,集合中是不会出现重复元素的
2.set是从小到大遍历的,也就是说set会帮我们排序

映射:map()

定义:将关键字集合(key)映射到值集合(value)

头文件:<map>

构造一个映射:map<类型1,类型2> m //将类型1映射到类型2

插入一对映射:insert()

检测是否存在(存在:1,否则:0):count()

访问及修改映射:dict["Tom"]=1

迭代器:map<string,int>: :iterator it

访问映射的长度:size()

注意:在C++遍历map是按照关键字从小到大遍历的

#include<map>
#include<string>
#include<utility>
using namespace std;
pair<string,int> a; 
map<string,int> dict; 
int main(){dict.insert(make_pair("Tom",1));//{"Tom"->1}   //插入元素dict.insert(make_pair("Jone",2));//{"Tom"->1,"Jone"->2}dict.insert(make_pair("Mary",1));//{"Tom"=>1,"Jone"->2,"Mary"->1} if(dict.count("Mary")){         //判断元素是否存在cout<<"Mary is in class"<<dict["Mary"]<<endl;dict["Mary"]=5; }for(map<string,int>::iterator it=dict.begin();it!=dict.end();it++){//迭代器进行遍历cout<<it->first<<" is in class"<<it->second<<endl; }dict.clear();   //清空该映射return 0;
}

栈:

特点:只能从一个方向处理数据

头文件:<stack>

创造空栈:stack<int> s

判断栈是否为空(为空返回true,否则返回false): s.empty()

返回栈中元素的个数,即栈的长度:s.size()

获取栈顶的元素:s.top()

插入元素x为新的栈顶元素:s.push()

删除s栈顶元素:s.pop();

注:切记不要在栈为空的时候访问top会出段错误!!!

队列:

头文件:<queue>

特点:

  • 只能访问表的首元素并删除首元素
  • 只能在表的最后端插入元素
  • 最前端的叫做队头
  • 最后端的叫做队尾

构造一个队列:queue<int> a

入队:a.push()

出队:a.pop()

判断队列是否为空:a.empty()

访问队首元素:a.front()

访问队列的长度:a.size()

清空队列:一个一个地清空

//清空队列while(!a.empty()){a.pop();} 

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

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

相关文章

SQLite 简介

什么是SQLite&#xff1f; SQLite是一个轻量级的嵌入式关系型数据库&#xff0c;它以一个小型的C语言库的形式存在。它的设计目标是嵌入式的&#xff0c;而且已经在很多嵌入式产品中使用了它&#xff0c;它占用资源非常的低&#xff0c;在嵌入式设备中&#xff0c;可能只需要几…

机器学习面试题总结60-99

目录 60、Python到底是什么样的语言? 61.Python是如何进行内存管理的? 引用计数和垃圾回收。

leetcode-存在重复元素

217. 存在重复元素 把列表转成集合&#xff0c;我们知道集合中是没有重复元素的&#xff0c;然后和原列表的长度做对比&#xff0c;不相等说明是有重复元素的 class Solution:def containsDuplicate(self, nums: List[int]) -> bool:if len(set(nums)) len(nums):return …

状态码400以及状态码415

首先检查前端传递的参数是放在header里边还是放在body里边。 此图前端传参post请求&#xff0c;定义为’Content-Type’&#xff1a;‘application/x-www-form-urlencoded’ 此刻他的参数在FormData中。看下图 后端接参数应为&#xff08;此刻参数前边什么都不加默认为requestP…

Qt QScrollArea 不显示滚动条 不滚动

使用QScrollArea时&#xff0c;发现添加的控件超出QScrollArea 并没有显示&#xff0c;且没有滚动条效果 原因是 scrollArea指的是scrollArea控件本身的大小&#xff0c;肉眼能看到的外形尺寸。 scrollAreaWidgetContents指的是scrollArea控件内部的显示区域&#xff0c;里面可…

2024 高级前端面试题之 React 「精选篇」

该内容主要整理关于 React 模块的相关面试题&#xff0c;其他内容面试题请移步至 「最新最全的前端面试题集锦」 查看。 React模块精选篇 1. 如何理解React State不可变性的原则2. JSX本质3. React合成事件机制4. setState和batchUpdate机制5. 组件渲染和更新过程6. Diff算法相…

windows server 开启远程连接RDP连接

windows server 开启远程连接&#xff0c;RDP连接windows server 打开gpedit.msc, 找到计算机配置-管理模板-windows组件-远程桌面服务-远程桌面会话主机-授权 1 使用指定的远程桌面许可证服务器 2 设置远程桌面授权模式 3 重启windows server服务器生效 4使用mstsc命令连接…

未来每家公司都需要有自己的大模型- Hugging Face创始人分享

自ChatGPT发布以来&#xff0c;有人称其是统治性一切的模型。Hugging Face创始人兼首席执行官Clem Delangue介绍&#xff0c;Hugging Face平台已经有15000家公司分享了25万个开源模型&#xff0c;当然这些公司不会为了训练模型而训练模型&#xff0c;因为训练模型需要投入大量资…

Springboot自定义线程池实现多线程任务

1. 在启动类添加EnableAsync注解 2.自定义线程池 package com.bt.springboot.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.concurrent.ThreadPoolTask…

记录 | ubuntu nm命令的基本使用

什么是nm命令 nm命令是linux下针对某些特定文件的分析工具&#xff0c;能够列出库文件&#xff08;.a、.lib&#xff09;、目标文件&#xff08;*.o&#xff09;、可执行文件的符号表。 nm命令的常用参数 -A 或 -o 或 --print-file-name&#xff1a;打印出每个符号属于的文件…

webassembly003 TTS BARK.CPP

TTS task TTS&#xff08;Text-to-Speech&#xff09;任务是一种自然语言处理&#xff08;NLP&#xff09;任务&#xff0c;其中模型的目标是将输入的文本转换为声音&#xff0c;实现自动语音合成。具体来说&#xff0c;模型需要理解输入的文本并生成对应的语音输出&#xff0…

Mysql 为表增加计算列

什么叫计算列呢&#xff1f;简单来说就是某一列的值是通过别的列计算得来的。 增加计算列的语法格式如下&#xff1a; col_name data_type [GENERATED ALWAYS] AS (expression) [VIRTUAL | STORED] [UNIQUE [KEY]] [COMMENT comment] [NOT NULL | NULL] [[PRIMARY] KEY]; 下…

c++学习记录 多态—案例2—电脑组装

#include<iostream> using namespace std;//抽象不同的零件//抽象的cpu类 class Cpu { public://抽象的计算函数virtual void calculate() 0; };//抽象的显卡类 class VideoCard { public://抽象的显示函数virtual void display() 0; };//抽象的内存条类 class Memory …

华为通用软件开发工程师24校招三轮面试详细记录

本文介绍2024届秋招中&#xff0c;华为技术有限公司的通用软件开发工程师岗位的3场面试基本情况、提问问题等。 7月投递了华为技术有限公司的通用软件开发工程师岗位&#xff0c;所在部门为海思半导体与器件业务部。目前完成了一面、二面与三面等全部流程&#xff0c;在这里记录…

K210 UART串口通信介绍与 STM32通信

目录 K210-UART串口通信相关函数&#xff1a; 使用K210串口的时候需要映射引脚&#xff1a; K210与STM32串口通信 发送单字节&#xff1a; K210端 STM32端 发送数据包 K210端 STM32端 K210的UART模块支持全双工通信&#xff0c;可以同时进行数据的发送和接收。在K21…

Nginx启用WebSocket支持

报错内容nginx.conf proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; 问题解决WebSocket跨域 add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Credentials true;

常用芯片学习——AMS1117芯片

AMS1117 1A 低压差线性稳压器 使用说明 AMS1117 是一款低压差线性稳压电路&#xff0c;该电路输出电流能力为1A。该系列电路包含固定输出电压版本和可调输出电压版本&#xff0c;其输出电压精度为士1.5%。为了保证芯片和电源系统的稳定性&#xff0c;XBLWAMS1117 内置热保护和…

对鸢尾花进行分类预测-----pycharm

项目说明 #项目&#xff1a; 对鸢尾花进行分类预测 #实例数量150个(3类各50个) #属性数量&#xff1a;4(数值型&#xff0c;数值型&#xff0c;帮助预测的属性和类) #特征&#xff1a;花萼长度&#xff0c;花萼宽度&#xff0c;花瓣长度&#xff0c;花瓣宽度 单位&#xff1…

SVG 字体 – SVG defs(15)

简介 defs 元素中嵌套了在SVG图片中可重用的定义。在def元素内定义的图形不会展示在SVG图片上。必须通过use元素来引用。 例子 <svg width="500" height="500"><defs>

什么是事务?

事务 是一组操作的集合&#xff0c;它是一个不可分割的工作单位。事务会把所有的操作作为一个整体&#xff0c;一起向数据库提交或者是撤销操作请求。所以这组操作要么同时成功&#xff0c;要么同时失败。 1. 事务管理 怎么样来控制这组操作&#xff0c;让这组操作同时成功或…