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

news2024/11/25 20:45:39

目录

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,3

	for (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.coloradmin.cn/o/1561436.html

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

相关文章

Mysql数据备份与恢复实战

文章目录 备份类型备份内容备份工具mysqldump备份 实战案例&#xff1a;恢复误删除的表准备工作2:30完全备份完全备份后更新数据表10:00误删students表需要恢复还原的状态开始还原恢复 为什么要备份&#xff1f; 备份是为了&#xff1a;灾难恢复&#xff1a;硬件故障、软件故障…

维安电子、费斯托中国等20+智能制造企业共探渠道管理数字化

近日&#xff0c;纷享销客新增长100人系列活动之制造业专场&#xff0c;我们有幸邀请维安电子、费斯托工具一起&#xff0c;共同探讨制造业渠道管理的新理念、新增长和新实践。 活动聚集了维安电子、费斯托工具、唐纳森、中科新松、斯可络、江浪科技、上海沪工等等20余位标杆制…

算法学习——LeetCode力扣动态规划篇9(1035. 不相交的线、53. 最大子数组和、392. 判断子序列、115. 不同的子序列)

算法学习——LeetCode力扣动态规划篇9 1035. 不相交的线 1035. 不相交的线 - 力扣&#xff08;LeetCode&#xff09; 描述 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#x…

针对 qt的sqlite加密数据库sqlitecipher插件QtCipherSqlitePlugin

&#x1f482; 个人主页:pp不会算法^ v ^ &#x1f91f; 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主 &#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 文章目录 简介编译安装使用可视化工具查看完结 简介 在客户端存储…

【docker】基础操作命令

docker run:干两步&#xff0c;本地找一下有没有集装箱&#xff0c;有运行&#xff0c;没有远程仓库下载运行。还没有报错。 docker好处&#xff1a; 不需要进行物理层模拟&#xff0c;不需要hypervisor利用的内核是宿主机的内核&#xff0c;不需要重新加载Linux内核 镜像相关…

QT-飞机水平仪图标

QT-飞机水平仪图标 一、演示效果二、关键程序三、下载链接 一、演示效果 二、关键程序 #include <stdio.h> #include <stdlib.h> #include <string.h>#include <QtCore> #include <QtGui> #include <QDebug> #include <QTableWidget&g…

刷题之动态规划-路径问题

前言 大家好&#xff0c;我是jiantaoyab&#xff0c;开始刷动态规划的题目了&#xff0c;要特别注意初始化的时候给什么值。 动态规划5个步骤 状态表示 &#xff1a;dp数组中每一个下标对应值的含义是什么->dp[i]表示什么状态转移方程&#xff1a; dp[i] 等于什么1 和 2 是…

python毕业设计django宠物寄存系统fn62p

本文所设计的宠物寄存中心系统的设计与实现拥有前端和后端&#xff0c;前端使用Vue.js框架和创建&#xff0c;后端使用django框架创建&#xff0c;开发语言采用python&#xff0c;使用Mysql数据库对后台数据进行存储。将pcyahrm作为主要的开发工具。接着进行系统的需求分析、功…

surfer绘制等值线图

surfer介绍 Surfer软件&#xff0c;是美国Golden Software公司编制的一款以画三维图的软件。该软件具有强大的插值功能和绘制图件能力&#xff0c;可用来处理XYZ数据&#xff0c;是地质工作者常用的专业成图软件&#xff08;来源于百度百科&#xff09;。 surfer可以用来绘制…

Linux文件与进程交互的窥探者lsof

lsof 是一个 Linux 和 UNIX 系统中的实用工具,用于列出系统中打开文件的所有信息。这个名字代表 “List Open Files”,但它也可以显示进程相关的其他信息,如: 打开的文件描述符列表 打开网络连接的列表 被进程使用的信号和内核对象等 在Linux系统中,有一个经典的概念: …

NOSQL - Redis的简介、安装、配置和简单操作

目录 一. 知识了解 1. 关系型数据库与非关系型数据库 1.1 关系型数据库 1.2 非关系型数据库 1.3 区别 1.4 非关系型数据库产生背景 1.5 NOSQL 与 SQL的数据记录对比 2. 缓存相关知识 2.1 缓存概念 2.2 系统缓存 2.3 缓存保存位置及分层结构 二 . redis 相关知识 1.…

【MySQL】13. 索引(重点)

1. 没有索引&#xff0c;可能会有什么问题 索引&#xff1a;提高数据库的性能&#xff0c;索引是物美价廉的东西了。 不用加内存&#xff0c;不用改程序&#xff0c;不用调sql&#xff0c;只要执行正确的 create index &#xff0c;查询速度就可能提高成百上千倍。 但是天下没…

如何提高小红书笔记的收录率?

在小红书平台上&#xff0c;笔记的收录率是衡量一篇笔记是否受欢迎和有价值的重要因素。为了提高笔记的收录率&#xff0c;有几个关键点需要注意&#xff1a; 1.内容不涉及广告 在发布笔记前要先确保笔记内容不包含任何形式的广告或推广信息。小红书平台对于广告性质的内容有…

关于 HEAP CORRUPTION DETECTED:after Normal block 错误的原因及解析

目录 一、HEAP CORRUPTION DETECTED:after Normal block 出现的报错情况&#xff1a; 二、问题原因&#xff08;重要&#xff09;&#xff1a; 三、举例 1.错误代码如下&#xff1a; 2.错误原因及分析&#xff08;重要&#xff09;&#xff1a; 3.解决方法 ​编辑 4.正…

OMP压缩感知仿真(MATLAB)

clc; clearvars; close all;% 读文件 Ximread(mandrill256.bmp); tic; Xdouble(X); [m,n]size(X);% % 小波变换矩阵生成 [LL1, LH1, HL1, HH1] dwt2(X, haar); [LL2, LH2, HL2, HH2] dwt2(LL1, haar); % [LL3, LH3, HL3, HH3] dwt2(LL2, haar); % [LL4, LH4, HL4, HH4] d…

Demis Hassabis,这位被封为爵士的AI领域的杰出研究者和神经科学家,是否能成为Google的救星?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Jquery——js库

1. jQuery 基础操作 jQuery 是一个快速、小巧的 JavaScript 库&#xff0c;设计用于简化 HTML 文档的遍历、事件处理、动画设计和 Ajax 交互。jQuery 使用户能够更快地编写 JavaScript 代码&#xff0c;并且能够更容易地处理 HTML 文档、事件、动画和 Ajax。 加载 jQuery 要…

HDLbits 刷题 -- Alwaysblock2

学习&#xff1a; For hardware synthesis, there are two types of always blocks that are relevant: Combinational: always (*)Clocked: always (posedge clk) Clocked always blocks create a blob of combinational logic just like combinational always blocks, but…

【DETR系列目标检测算法代码精讲】01 DETR算法03 Dataloader代码精讲

与一般的Dataloader的区别在于我们对图像进行了随机裁剪&#xff0c;需要进行额外的操作才能将其打包到dataloader里面 这一段的代码如下&#xff1a; if args.distributed:sampler_train DistributedSampler(dataset_train)sampler_val DistributedSampler(dataset_val, shu…

LeetCode-48. 旋转图像【数组 数学 矩阵】

LeetCode-48. 旋转图像【数组 数学 矩阵】 题目描述&#xff1a;解题思路一&#xff1a;一行代码&#xff01;Python zip函数图一乐【zip函数实现主对角线翻转&#xff0c;[::-1]实现垂直翻转】解题思路二&#xff1a;其实我们也可以先水平轴翻转&#xff0c;让后主对角线翻转。…