STL:string类使用

news2024/11/28 8:52:11

编码:
ASCII

unicode–utf-8
utf-16----一个字符2个字符
utf-32----一个字符4个字节

gbk–中文编码表

string:

是一个特殊的容器,对数据(字符数组)和库函数(strlen等)进行封装
STL提供的内容都在标准命名空间下

构造方式

在这里插入图片描述

输出方式

下标[ ],迭代器,范围for
在这里插入图片描述

常用函数

reversereverse(s.begin(), s.end())逆置
size,length返回字符串的有效个数
resize改变有效元素个数
capacity容量
reserve扩容
clear清空
empty判空

string里的容量使用:
string s(“hello”);
cout <<s.size()<<endl;
cout<<s.capacity()<<endl;
if(s.empty())
cout<<”空”<<endl
else
cout<<不空<<endl;
s.clear();

resize:调整有效元素个数
增多:s.resize(10,’!’); //将有效元素个数扩容到十个,多出的空间用!填充;如果底层空间不够则有特定的扩容方式
减少:s.resize(5); //减少时,容量空间不会改变,只减少有效元素个数

reserve:扩容
当参数大于底层空间确实会扩容
减少容量时,有一个数值标准(15),小于某个值才会真正减少
s.reserve(20) ; //直接扩容到20(开辟新空间,拷贝元素,释放旧空间),

顺序表由一个char指针两个size_t构成12个字节
String类型对象的大小为28,比顺序表多了16个字节,所以内部除了有一个char
指针两个size_t之外还有一段固定长度char类型的数组,应用于普通调用,不然每调用一次都要申请空间,效率变低

string里的元素访问:
operator[ ]:有普通类型对象,有const类型对象;越界用assert断言
const char& operator[ ] (size_t pos)const
char& operator[ ] (size_t pos)

cout<< s.[100] <<endl;
at:和[ ]一样,都是给一个位置,获取该处字符;越界抛异常
const char& at (size_t pos)const
char& at (size_t pos)

cout<< at(100) <<endl;

两个函数参数都一样,都是给一个位置获取该位置的字符;
两个函数对越界的处理方法不同,一个是异常,一个是抛异常;一般用第一种

元素的修改
1.追加:使用+=;+=追加的是字符,字符串,对像;push_back只追加字符
s+=”hello”

string s1(“hello”)
s+=s1;

使用append函数要有接收变量
s=s.append(3, ‘!’); //追加3个 !
s=s.append(s1, 1, 3); //从s1的1号位置开始追加3个字符

2.插入:
s=s.insert(0, ”word); //在0号位置插word
s=s.insert( 4, 3, ‘ ’); //在4的位置插3个空字符

3.任意位置删除:
s.erase(0, 5); //在0号位置开始删除五个元素
s.erase(s.begin()) //通过迭代器删除,这样写只删了begin处的元素
s.erase(s.begin(), s.end()) //删除这个区间的元素

把字符串中的内容转化成整型数字
string s(“12345”);
int val=atoi ( s.c_str( ) ) //atoi是c语言提供的函数,参数是char* 类,不能直接给s对象;需要将对象转化成c语言的方式,把空间首地址给atoi
cout<<val<<endl;
c_str

字符串截取:substr,截取都是从当前位置截,并生成一个子串,要注意±1
第一个参数是截取位置(默认从第0个开始)
第二个参数是截取长度(默认截取为n)
string s(“string.cpp”);
string post=s.substr(s.find(‘.’)+1 ); //从 . 位置开始截取,
如果不给参数,默认参数是npos,截到末位,
npos是string内部的静态成员变量

截取文件名
string s (“F:\work\string.cpp”);
string name = s.substr ( s.rfind(‘\’) +1);
cout<< name <<endl;

size_t pos1 = s.rfind(‘\’)+1;
size_t pos2 = s.rfind(‘.’);
string post=s.substr (post1, post2) //截两位置之间的

s.substr (post1, n); //从post1位置开始截取,截取长度n

find也有两个参数,第一个参数是截什么样的字符,第二个是从哪个位置截返回值为字符参数的标号

string的扩容机制效率太低,所以先扩容再放数据

6-19 string
string s;
cin >> s; 适用于一行只有一个字符串的接收
cout<< s <<endl; 输入hello word,只接收了hello

getline函数不能处理string类对象
getline(cin, s); //第一个参数是标准输入流对象,放到第二个参数s中
string s;
getline(cin, s);
cout<< s <<endl;

循环输入:
1.一行是单个字符串的输入
string s;
while(cin>>s)
{ }
2.一行有多个字符串,字符串之间用空格隔开
string s;
while(getline(cin, s))
{ }

例:计算一行字符串中,最后一个单词的长度
#include
int main()
{
string s;
while(getlin(cin, s)) //循环输入
{
cout<<s.substr( s.rfind(‘ ’)+1).size( )<<endl;
}
return0
}

string类型对象可以直接比大小
例1.将字符串中是字母的元素进行翻转
int left=0, right=s.size( )-1;
while(left<right)
{
while( left<right && isalpha( s[left] ) //先分别找左右两个不是字母的元素标号
{
left++;
}
while( left<right && isalpha( s[right] )
{
right–;
}
if(left!=right)
{
swap(arr[left], arr[right]);
left++;
right–;
}
}
Isalpha:int isalpha(int c)
检测参数c是否是英文字母,是字符返回true,不是返回NULL

例2.找字符串第一个不重复的字符,并返回元素下标。若不存在返回-1
Leetcode,返回0
先统计每个字符出现的次数

回文数组:
bool ischar (char ch ) //判断有效字符
{
if( ( ch>=0 && ch<=9 ) || ( ch>=’A’ && ch<=’Z’ ) || ( ch>=’a’ && ch<=’z’ ) )
return turn;
return false;
}
bool isPalindrome (string s)
{
for(auto& e : s )
{
if(e>=’a’ && e<=’z’) //将字符串中大写字母转化成小写
e+=32;
}
int left=0, right=s.size()-1;
while(left<right)
{
//左指针<右值指针,且左元素不是有效字符,则指针向右走一步再判断
while(left<right && ! ischar(s[left]) )
left++;
while(left<right && ! ischar(s[right]) )
right–;
if(s[left] != s[right]) //左右两字符相等则继续找,不等直接返回
return fale;
else
{
left++;
right–;
}
}
return true;
}

用字符串模拟数字相加
int lsize=num1.size(); //lsize是num1数组的元素个数
int rsize=num2.size();
if(lsize<rsize)
{
num1.swap(num2);
swap(lsize, rsize);
}
string result(lsize+1, ‘0’);
char step=0;
for(int lid=lsize-1, int rid=rsize-1; lid>=0; lid–,rid–)
{
if(rid>0)
char sum=num1[lid]-‘0’; //num1[lid]是数组num1中的字符,要进行运算就要减一个字符0
if(rid>=0)
{
sum+=num2[rid]-‘0’;
}
sum+=step;
step=0;
if(sum>9) //sum超过9就要进位
{
step=1;
sum-=10; //此时sum的值就是当前两个最低位
}
result[lid+1]=sum+’0’; //lid是原数组的长度,新数组比原数组多一个进位,所以+1
}
if(step==1) //循环完后,有进位则将1保存到首位,没有则删除首位
result[0]=’1’;
else
result. earse(result.begin( ) )
return result;

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

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

相关文章

OpenStack部署(三)

OpenStack部署 6. Neutron6.1 创建Neutron数据库并授权6.2 获得admin凭证6.3 创建 neutron 用户并设置密码6.4 添加admin角色到neutron 用户6.5 创建neutron服务实体6.6 创建网络服务API端点6.7 安装并配置neutron服务6.8 链接plugin.ini文件6.9 初始化neutron数据库6.10 重启计…

连续两年!PingCAP 入选 Gartner 云数据库“客户之声”,获评“卓越表现者”最高分

近日&#xff0c;全球权威信息技术研究与咨询机构 Gartner 发布了云数据库市场领域 2023 Gartner Peer Insights™“Voice of the Customer” 报告&#xff0c;PingCAP 在报告中获得的客户总体评分达到 4.9 分&#xff08;满分 5 分&#xff09;&#xff0c;在所有入选企业中位…

CBCGPCaptionBar 使用实例说明

CBCGPCaptionBar的位置如下&#xff1a; 如图区域就是 MainFrame.h中声明&#xff1a; CBCGPCaptionBar m_wndCaptionBar; MainFrame.cpp中创建显示控件&#xff1a; BOOL CMainFrame::CreateCaptionBar () { if (!m_wndCaptionBar.Create (WS_CHILD | WS_V…

力扣第三天 242.有效字母异位词 349 两个数组的交集

目录 1.242. 有效的字母异位词 2.349. 两个数组的交集 - 力扣&#xff08;LeetCode&#xff09;​​​​​​ 使用算法笔记&#xff1a; 总结&#xff1a; 1.242. 有效的字母异位词 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意…

15. 算法之排序算法

前言 排序是在软件开发中经常遇到的需求。比如基于订单的创建时间倒排&#xff0c;基于金额大小排序等等&#xff0c;那么这些排序底层是怎么写的呢&#xff0c;本节&#xff0c;我们就常用排序算法展开介绍。 1. 冒泡排序 1.1 算法思想 冒泡排序是最基础的排序算法。冒泡排…

HashMap 的底层原理和源码分析

tip&#xff1a;作为程序员一定学习编程之道&#xff0c;一定要对代码的编写有追求&#xff0c;不能实现就完事了。我们应该让自己写的代码更加优雅&#xff0c;即使这会费时费力。 推荐&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; 文章目录 一、HashMap…

【迷宫】地下迷宫游戏-微信小程序开发流程详解

可曾记得&#xff0c;小时候上学路边买的透明铅笔盒&#xff0c;里面内嵌了一个小球&#xff0c;它用重力可从起点滚动到终点&#xff0c;对小朋友来说是感觉有趣的&#xff0c;在这个游戏的基础上&#xff0c;弄一款微信小程序的迷宫探索游戏试试&#xff0c;在不同关卡的迷宫…

14 【Vuex】

1.理解 Vuex 1.1 Vuex 是什么 概念&#xff1a;专门在Vue中实现集中式状态&#xff08;数据&#xff09;管理的一个Vue插件&#xff0c;对Vue应用中多个组件的共享状态进行集中式的管理&#xff08;读/写&#xff09;&#xff0c;也是一种组件间通信的方式&#xff0c;且适用…

基于RK3399+FPGA的地面测试台多参数数据记录仪方案(一)软件设计及测试

完成了测试台软件分析和编程环境搭建后&#xff0c;接下来就是软件的编写。本章主要包括 软件窗口界面设计和功能代码实现。以某型号数据记录仪的工作需求为目标&#xff0c;根据测试 工作流程&#xff0c;以 Linux-Qt 为主要开发手段&#xff0c;设计一款功能完备、界面友…

Java8 Stream详解及结束操作方法使用示例(三)

结束操作是指结束 Stream 该如何处理的操作&#xff0c;并且会触发 Stream 的执行。下面是一些常用的结束操作方法。结束操作会对数据源进行遍历&#xff0c;因此是及早求值的。 Java8 Stream详解及中间操作方法使用示例&#xff08;一&#xff09; ​​​​​​​Java8 Strea…

三种经典博弈(取石子问题)

三种经典博弈 巴什博奕威佐夫博奕尼姆博奕 博弈是有一种很有意思的游戏&#xff0c;就是有物体若干堆&#xff0c;可以是火柴棍或是围棋子等等均可。两个人轮流从堆中取物体若干&#xff0c;规定最后取光物体者取胜。这是我国民间很古老的一个游戏&#xff0c;别看这游戏极其简…

一体化协同平台助力企业回归生产本质,创造价值

核心观点 单点工具的串联无法有效解决研效痛点问题&#xff0c;企业需要通过一体化协同平台提高端到端价值流动效率。一体化协同平台的价值是软件工程理念最大化落地、数字化研发管理、沉浸式研发体验。一体化协同平台集成需要评估闭环效率杠杆&#xff0c;确定集成边界和集成…

什么是关系模型? 关系模型的基本概念

关系模型由IBM公司研究员Edgar Frank Codd于1970年发表的论文中提出&#xff0c;经过多年的发展&#xff0c;已经成为目前最常用、最重要的模型之一。 在关系模型中有一些基本的概念&#xff0c;具体如下。 (1)关系(Relation)。关系一词与数学领域有关&#xff0c;它是集合基…

TensorRT 从7.2升级到8.5,改写plugin以适配新版本

前言 TensorRT是NVIDIA推出的一款高效深度学习模型推理框架&#xff0c;其包括了深度学习推理优化器和运行时&#xff0c;能够让深度学习推理应用拥有低时延和高吞吐的优点。 TensorRT的版本迭代速度非常快&#xff0c;很多之前写的plugin在版本升级后可能就没法直接使用&…

广州虚拟动力携数字人交互技术产品参展第十九届深圳文博会

2023年6月7-11日 深圳国际会展中心 第十九届深圳文博会正式举办&#xff01; 广州虚拟动力携数字人交互技术产品参展 诚邀您莅临粤港澳大湾区馆&#xff08;11号馆&#xff09; 广东参展团展位参观交流 数字技术&#xff0c;引领文化产业新发展 中国文化及相关文化产业的…

【Apache Pinot】Controller、Broker 和 Server 的概念和工作流程

背景 笔者最近一段时间使用 Apache Pinot 比较多&#xff0c;发现目前国内使用 Pinot 的很少&#xff0c;所以跟他相关的资料也比较少&#xff0c;本人在扩容&#xff0c;升级&#xff0c;部署&#xff0c;查询等方面操作有些许经验&#xff0c;知道其中有很多细节需要注意和规…

北邮22信通:实验七 三角波-方波(锯齿波-矩形波)发生器实验报告(着急验收的同学先看看,后续细节正在赶来中)

北邮22信通一枚~ 持续更新模电实验讲解 关注作者&#xff0c;解锁更多邮苑模电实验报告~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22信通——电子电路_青山如墨雨如画的博客-CSDN博客 实验七 三角波-方波&#xff08;锯齿波-矩形波&#xff09;发生器实验…

数据结构——树的概念、二叉树的概念

文章目录 引言1.树的概念1.1.树的其他相关概念 2.树的代码实现的结构2.1.树形结构的应用 3.二叉树的概念3.1.特殊二叉树的概念3.1.1.完全二叉树3.1.2.满二叉树 3.2.二叉树试题讲解3.2.1.试题一3.2.2.试题二3.2.3.试题三 4.二叉树的存储结构4.1.顺序结构存储4.2.链式结构存储 引…

重温经典:简读光干涉、衍射原理

如果您不是光学专业的&#xff0c;或者是文科生&#xff0c;那么您想到光的干涉和衍射第一反应应该是很多公式对不对&#xff1f;头好大是不是&#xff1f;好&#xff0c;那么今天我们就不用一个公式来重新解读光的干涉和衍射。 光&#xff0c;也叫电磁波&#xff0c;他的表现…

java并发编程:Java线程池详解

文章目录 为什么要用线程池线程池的原理ThreadPoolExecutor提供的构造方法ThreadPoolExecutor的策略线程池主要的任务处理流程ThreadPoolExecutor如何做到线程复用的&#xff1f; 四种常见的线程池newCachedThreadPoolnewFixedThreadPoolnewSingleThreadExecutornewScheduledTh…