STL容器的一些操作(常用的,不全)

目录

string 

1.string的一些创建

 2.string 的读入和输出:

 3.string的一些操作

 4.彻底清空string 容器的函数

vector 

1.vector的一些创建:

2.vector的一些操作:

3.vector的彻底清空并释放内存:

queue

循环队列:queue

1.循环队列的创建以及操作

优先队列:priority_queue

1.优先队列创建以及操作

stack

1.栈的创建以及操作 

deque

1.双端队列的创建以及操作

参考:


所有容器都有.size()函数以及.empty()函数

string 

头文件为<string>

如果有窗口中的代码省略了一些东西是因为下面这些有关的代码都在同一文件中,唯独vector那里写的代码是各自独立的

1.string的一些创建

//string的一些创建
string s1;	//默认初始化,s1是个空字符串
string s2 = s1;		//s2是s1的副本,s2只是与s1的值相同,不是指向同一段地址
string s3 = "hiyaaaa";		//s3是该字符串字面值的副本string s4(10, 'c');			//s4的内容是"cccccccccc";string str2(s3, 3, 5);		//将str2初始化为s3中从第3位置到第5为止的字符
string str3(s3, 3);		//将str3初始化为s3中从第3位置到末尾的字符string str4("hellonihao", 5);	//将str4初始化为从字符串常量开头往后5字节的内容(会输出hello)

 2.string 的读入和输出:

//string 的读入和输出:
cin >> s1;
cout << s1 << endl;;
printf("%s", s1.c_str());	//printf不能直接输出string,要写成这样,用.c_str()函数
//用getline读入一整行
string s;
getline(cin, s);
cout << s << endl;
//关于c风格字符串的其他事情:
char ss[20];
fgets(ss, 20, stdin);		//用法类似于被弃用的gets,只不过第二参数要包括结尾的'\0'
cin.getline(ss, 20);		//往ss中读入一行

 3.string的一些操作

//string支持>,<,>=,<=,==,!=等所有比较操作,按字典顺序进行比较bool flag = s1 == s3;//字面值和string对象相加:string ss1 = "hello", ss2 = "world";string ss3 = s1 + "," + s2 + '\n';	//当把string对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符的两侧的运算对象至少有一个是string://string的.empty()函数,来判断当前容器是否为空string arr1, arr2 = "1231";cout << arr1.empty() << endl;cout << arr2.empty() << endl;//string 的.size()函数,输出字符串里面字符的大小cout << arr1.size() << endl;cout << arr2.size() << endl;

 4.彻底清空string 容器的函数

//彻底清空string 容器的函数(.clear()并不会释放内存空间,只会把size()清零
s1.clear();		//使用shrink_to_fit()函数前,先用clear()清空
s1.shrink_to_fit();		//将s1多余的空间(未使用)释放
cout << "Capacity after shrink_to_fit() is " << s1.capacity()<< " and size is " << s1.size() << '\n';string().swap(s3);		//将s3清零并释放
cout << "Capacity after swap() is " << s3.capacity() << " and size is " << s3.size() << '\n';


vector 

头文件为 <vector>

1.vector的一些创建:

vector<int>a;		//相当于一个长度动态变化的int数组
vector<int>b[233];		//相当于第一维长233(不可改变),第二位长度动态变化的int数组
vector<double>c(20, 2.2);	//创建了一个大小为20的,且内容全为2.2的double数组
int n = 4, m = 5;
vector<vector<int>>aa(n, vector<int>(m));		//相当于创建了4*5的二维数组
//其他方法创建二维数组
vector<vector<int>>aa2(n);
for (int i = 0; i < n; i++)aa2[i].resize(m, 1);	
vector<int>arr1(5,1);
vector<int>arr2(arr1);	//将arr1中的元素复制到arr2中
vector<string>str1(5, "nihao");
vector<string>str2(str1.begin(),str1.end());		//将str1的元素复制到str2中
vector<int>shuzu1={ 1,23,4,5 };			//shuzu1初始化为1,23,4,5
vector<int>shuzu2({ 1,23,4,5 });		//shuzu2初始化为1,23,4,5

2.vector的一些操作:

//.size()输出大小,.empty()判断是否为空,.clear()清空,但无法释放内存vector<int>a(5, 2);cout << a.size() << endl;cout << a.empty() << endl;a.clear();cout << a.size() << endl;cout << a.empty() << endl;vector<int>b({ 11,2,3,4,5 });cout << b.front() << endl;		//.front()返回第一个元素cout << b.back() << endl;		//.back()返回最后一个元素int x = 555;b.push_back(x);		//.push_back(x)把元素x插入到尾部b.pop_back();		//.pop_back()删除最后一个元素//迭代器,类似于指针,可以用来解引用for (vector<int>::iterator it = b.begin(); it != b.end(); it++)cout << *it << endl;cout << endl;for (auto it = b.begin(); it != b.end(); it++)		//方便起,可以用auto关键字cout << *it << endl;//.begin()返回vector中第一个元素的迭代器,.end()返回vector的尾部,即其中最后元素的下一个位置//利用迭代器运用binary_search()函数(头文件为<algorithm>)去寻找值,vector<int>::iterator ie = b.begin();bool cc = binary_search(b.begin(), ie+3,3 );cout << endl<< cc << endl;

3.vector的彻底清空并释放内存:

	vector<int>a(50, 2);cout << a.capacity() << "\t" << a.size() << endl;a.clear();		//用.shrink_to_fit()函数前,先用clear()清空a.shrink_to_fit();cout << a.capacity() << "\t" << a.size() << endl;vector<int>b(50, 2);cout << b.capacity() << "\t" << b.size() << endl;vector<int>().swap(b);			//利用交换来清空cout << b.capacity() << "\t" << b.size() << endl;

ps:

在参考链接那里,有个文章的vector的swap清空写错了,应该改为:vector<int>().swap(nums)


queue

头文件为<queue>

队列是先进先出的结构,从队尾插入,队头弹出

循环队列:queue

1.循环队列的创建以及操作

push    // 从队尾插入
pop     // 从队头弹出
front   // 返回队头元素
back    // 返回队尾元素
queue<int> q;		//循环队列//队列没有迭代器,无法遍历输出。for(int i=0;i<4;i++){q.push(29 + i);		//.push()往队尾插入}cout << q.front() << endl;		//.front()返回队头元素cout << q.back() << endl;		//.back()返回队尾元素q.pop();		//.pop()删除队头元素cout << q.front() << endl;

优先队列:priority_queue

1.优先队列创建以及操作

push    // 把元素插入堆
pop     // 删除堆顶元素
top     // 查询堆顶元素(最大值)

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct ps1
{int a;int b;bool operator <(const ps1& j)const		//重载小于号{return a < j.a;}};
int main()
{	//优先队列里没有.front()以及.back()priority_queue<int>q;				//优先队列,默认大根堆,即堆顶元素为最大值priority_queue<int, vector<int>, greater<int>>p;	//小根堆priority_queue<ps1>ps;				//优先队列,类型为结构体,默认大根堆,要重载小于号,ps.push({ 2, 3 });				//把结构体元素插入堆ps.push({ 22,33 });cout << ps.size() << endl;		//.size()输出元素长度cout << ps.top().b << endl;		//.top()查询堆顶元素(默认大根堆的话,就是最大值)ps.pop();						//.pop()删除堆顶元素cout << ps.top().b << endl;cout << ps.empty() << endl;		//.empty()判断是否为空//队列的清空,队列没有.clear()函数ps = priority_queue<ps1>();		//可以让队列等于一个空队列,来清空里面的值cout << ps.empty() << endl;		//.empty()判断是否为空priority_queue<ps1>().swap(ps);			//通过与空队列交换来释放空间return 0;
}


stack

头文件为<stack>

栈,先进先出,栈顶插入,栈顶弹出  

1.栈的创建以及操作 

push    // 向栈顶插入
pop     // 弹出栈顶元素
top     // 查询栈顶元素
stack<int> a;			//定义栈a
a.push(50);		//.push()向栈顶插入
a.push(3);
a.push(100);
cout << a.top() << endl;		//.top()查询栈顶元素
a.pop();				//.pop()弹出栈顶元素
cout << a.top() << endl;
cout << endl;
cout << a.size() << endl;
stack<int>().swap(a);			//通过交换空栈来释放空间
cout << a.size() << endl;


deque

头文件为<deque>

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

1.双端队列的创建以及操作

[]              // 随机访问
begin/end       // 返回deque的头/尾迭代器
front/back      // 队头/队尾元素
push_back       // 从队尾入队
push_front      // 从队头入队
pop_back        // 从队尾出队
pop_front       // 从队头出队
clear           // 清空队列
#include <iostream>
#include <vector>
#include <deque>
using namespace std;int main()
{	deque<int>q(5, 2);			//初始化双端队列q,元素个数是5,都为2;deque<int>p = { 1,2,3 };			//初始化为1,2,3for (auto k : q)cout << k << "  ";cout << endl;for (auto k : p)cout << k << "  ";cout << endl;cout << p.front() << endl;	//.front()返回队头元素cout << p.back() << endl;	//.back()返回队尾元素p.push_back(55);			//.push_back()队尾入队p.push_front(33);			//.push_front()队头入队for (auto k = p.begin(); k != p.end(); k++)		//.begin()返回双端队列的头迭代器,.end()返回双端队列的尾迭代器cout << *k << "  ";cout << endl;p.pop_back();			//.pop_back()从队尾出队for (auto k = p.begin(); k != p.end(); k++)		cout << *k << "  ";cout << endl;p.pop_front();			//.pop_front()从队头出队for (auto k = p.begin(); k != p.end(); k++)		cout << *k << "  ";cout << endl;p[0] = 999;for (auto k = p.begin(); k != p.end(); k++)cout << *k << "  ";cout << endl;deque<int>().swap(p);			//与空双端队列交换,来释放内存cout << p.size() << endl;return 0;
}

参考:

【C++】如何释放vector的内存空间及std::vector::shrink_to_fit用法简介_vector shrink_to_fit-CSDN博客

 string对象的内存释放_如何将string内存清空-CSDN博客

C++ string清空并释放内存空间的两种方法(shrink_to_fit()、swap())_c++ string 释放-CSDN博客

顺序容器: 内存管理(shrink_to_fit、capacity、reserve)-CSDN博客

C++中的 c_str() 函数-CSDN博客


c++使用vector创建二维数组的方法_利用vector定义二维数组-CSDN博客

C++ vector用法详解_vector c++ 用法-CSDN博客

【C++】auto关键字_c++ auto-CSDN博客

C++11新特性:基于范围的循环(foreach)_c++11 foreach-CSDN博客


C++:运算符重载_哔哩哔哩_bilibili

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

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

相关文章

兑换码生成算法

兑换码生成算法 兑换码生成算法1.兑换码的需求2.算法分析2.重兑校验算法3.防刷校验算法 3.算法实现 兑换码生成算法 兑换码生成通常涉及在特定场景下为用户提供特定产品或服务的权益或礼品&#xff0c;典型的应用场景包括优惠券、礼品卡、会员权益等。 1.兑换码的需求 要求如…

Pointnet++分类和分割数据集准备和实验复现

5.分类数据集Modelnet40及可视化 Modelnet40分类数据集 原始的modelnet40是off文件&#xff0c;是cad模型 OFF文件是一种用于存储三维对象信息的文件格式&#xff0c;全称为"Object File Format"。它主要用于存储几何体的顶点、边和面信息&#xff0c;以及可能的颜…

面对复杂多变的网络攻击,企业应如何守护网络安全

企业上云&#xff0c;即越来越多的企业把业务和数据&#xff0c;迁移到云端。随着云计算、大数据、物联网、人工智能等技术的发展&#xff0c;用户、应用程序和数据无处不在&#xff0c;企业之间的业务边界逐渐被打破&#xff0c;网络攻击愈演愈烈&#xff0c;手段更为多。 当前…

uni app 扫雷

闲来无聊。做个扫雷玩玩吧&#xff0c;点击打开&#xff0c;长按标记&#xff0c;标记的点击两次或长按取消标记。所有打开结束 <template><view class"page_main"><view class"add_button" style"width: 100vw; margin-bottom: 20r…

Docker容器监控之CAdvisor+InfluxDB+Granfana

介绍&#xff1a;CAdvisor监控收集InfluxDB存储数据Granfana展示图表 目录 1、新建3件套组合的docker-compose.yml 2、查看三个服务容器是否启动 3、浏览cAdvisor收集服务&#xff0c;http://ip:8080/ 4、浏览influxdb存储服务&#xff0c;http://ip:8083/ 5、浏览grafan…

如何利用CSS实现文字滚动效果

1. 使用CSS3的animation属性 CSS3的animation属性可以让元素在一段时间内不停地播放某个动画效果。我们可以利用这个特性来实现文字滚动效果。 我们需要定义一个包含所有需要滚动的文本的容器元素。比如&#xff1a; <div class"scroll-container"><p>…

JAV八股--redis

如何保证Redis和数据库数据一致性 关于异步通知中消息队列和Canal的内容。 redisson实现的分布式锁的主从一致性 明天继续深入看这个系列问题 介绍IO复用模型

【机器学习300问】59、计算图是如何帮助人们理解反向传播的?

在学习神经网络的时候&#xff0c;势必会学到误差反向传播&#xff0c;它对于神经网络的意义极其重大&#xff0c;它是训练多层前馈神经网络的核心算法&#xff0c;也是机器学习和深度学习领域中最为重要的算法之一。要正确理解误差反向传播&#xff0c;不妨借助一个工具——计…

代码随想录算法训练营第24天|理论基础 |77. 组合

理论基础 jia其实在讲解二叉树的时候&#xff0c;就给大家介绍过回溯&#xff0c;这次正式开启回溯算法&#xff0c;大家可以先看视频&#xff0c;对回溯算法有一个整体的了解。 题目链接/文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;带你学透回溯算法&#xff08;理…

深入理解数据结构——堆

前言&#xff1a; 在前面我们已经学习了数据结构的基础操作&#xff1a;顺序表和链表及其相关内容&#xff0c;今天我们来学一点有些难度的知识——数据结构中的二叉树&#xff0c;今天我们先来学习二叉树中堆的知识&#xff0c;这部分内容还是非常有意思的&#xff0c;下面我们…

前端秘法番外篇----学完Web API,前端才能算真正的入门

目录 一.引言 二.元素的获取和事件 1.获取元素 2.各种事件 2.1点击事件 2.2键盘事件 三.获取&修改操作 1.获取修改元素属性 2.修改表单属性 2.1暂停播放键的转换 2.2计数器的实现 2.3全选的实现 3.样式操作 3.1行内样式操作 3.2类名样式操作 四.节点 1.创…

记录Xshell使用ed25519公钥免密链接SSH

试了半天&#xff0c;Xshell好像没办法导入linux生成的ssh公钥,因此需要以下步骤实现免密登录 结论&#xff0c;在linux公钥文件中&#xff0c;将客户端生成的ed25519公钥加上去即可(一个公钥单独一行) 1.使用Linux生成秘钥文件(不需要输入私钥密码passphrase)或者直接创建一…

【Servlet】继承关系以及service方法

文章目录 一、继承关系二、相关方法 一、继承关系 Servlet接口下有一个GenericServlet抽象类。在GenericServlet下有一个子类HttpServlet&#xff0c;它是基于http协议。 继承关系 javax.servlet.Servlet接口​ javax.GenericServlet抽象类​ javax.servlet.http.HttpServ…

生产制造园区数字孪生3D大屏展示提升运营效益

在智慧园区的建设中&#xff0c;3D可视化管理平台成为必不可少的工具&#xff0c;数字孪生公司深圳华锐视点打造的智慧园区3D可视化综合管理平台&#xff0c;致力于将园区的人口、经济、应急服务等各项业务进行3D数字化、网络化处理&#xff0c;从而实现决策支持的优化和管理的…

C++多线程:Atomic原子类与CAS锁详解(十)

1、原子操作的概念 什么是原子操作&#xff1a; 原子被认为是构成物质最小的单位&#xff0c;是不可分割的一个东西。而在程序中原子操作被认为是不可分割的一个步骤或者指令其实我们很简单的程序&#xff0c;在高级语言中被认为是一个步骤的操作&#xff0c;编译成汇编指令之…

Redis从入门到精通(三)Jedis客户端、SpringDataRedis客户端

文章目录 前言第3章 Redis的Java客户端3.1 Jedis客户端3.1.1 快速使用3.1.2 连接池 3.2 SpringDataRedis客户端3.2.1 快速使用3.2.2 自定义序列化3.2.3 StringRedisTemplate 3.3 小结 前言 在上一章【Redis从入门到精通(二)Redis的数据类型和常见命令介绍】中&#xff0c;学习…

Springboot+MybatisPlus+EasyExcel实现文件导入数据

记录一下写Excel文件导入数据所经历的问题。 springboot提供的文件处理MultipartFile有关方法&#xff0c;我没有具体看文档&#xff0c;但目测比较复杂&#xff0c; 遂了解学习了一下别的文件上传方法&#xff0c;本文第1节记录的是springboot原始的导入文件方法写法&#xf…

docker-compse安装es(包括IK分词器扩展)、kibana、libreoffice

Kibana是一个开源的分析与可视化平台&#xff0c;设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的数据。 Kibana与Elasticsearch的交互方式是各种不同的图表、表格、地图等&#xff0c;直观的展示数据&#xff0c;从而达到高级的数据…

MySQL 优化及故障排查

目录 一、mysql 前置知识点 二、MySQL 单实例常见故障 故障一 故障二 故障三 故障四 故障五 故障六 故障七 故障八 三、MySQL 主从故障排查 故障一 故障二 故障三 四、MySQL 优化 1.硬件方面 &#xff08;1&#xff09;关于 CPU &#xff08;2&#xff09;关…

Reversing Linked List

Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K3, then you must output 3→2→1→6→5→4; if K4, you must output 4→3→2→1→5→6. Input Specifi…