STL库--string

目录

string的定义

string中内存的访问

string常用函数实例解析

string的定义

定义string的方式跟基本类型相同,只需要在string后跟上变量名即可:

string str;

如果要初始化,可以直接给string类型的变量进行赋值:

string str="abcd";

string中内存的访问

(1)通过下标访问

一般来说,可以直接像字符数组那样来访问string:

#include<stdio.h>
#include<string>
using namespace std;
int main(){string str="abcd";for(int i=0;i<str.length();i++){printf("%c",str[i]);}return 0;
}

如果要读入和输出整个字符串,则只能用cin和cout

#include<iostream>
#include<string>
using namespace std;
int main(){string str;cin>>str;cout<<str;return 0;
}

上面的代码对任意的字符串输入,都会输出同样的字符串。

那么,其实也可以使用printf来输出string,即用c_str()将string类型转换为字符数组进行输出。

#include<stdio.h>
#include<string>
using namespace std;
int main(){string str="abcd";printf("%s\n",str.c_str());return 0;
}

(2)通过迭代器访问

一般仅通过(1)即可满足访问的要求,但是有些函数比如insert()与erase()则要求以迭代器为参考。

由于string不像其它STL容器那样需要参数,因此可以直接如下定义:

string::iterator it;

这样就得到了迭代器it,并且可以通过*it来访问string里的每一位:

#include<stdio.h>
#include<string>
using namespace std;
int main(){string str="abcd";for(string::iterator it=str.begin();it!=str.end();it++){printf("%c",*it);}return 0;
}

最后指出,string和vector一样,支持直接对迭代器进行加减某个数字,如str.begin()+3的写法是可行的。

string常用函数实例解析

(1)operator+=

这是string的加法,可以将两个string直接拼接起来

#include<iostream>
#include<string>
using namespace std;
int main(){string str1="abc",str2="xyz",str3;str3=str1+str2;//将str1和str2拼接起来,赋值给str3str1+=str2;//将str2直接拼接到str1上cout<<str1<<endl;cout<<str3<<endl;return 0; 
}

(2)compare operator

两个string类型可以直接使用==、!=、<、<=、>、>=比较大小,比较规则是字典序。

#include<stdio.h>
#include<string>
using namespace std;
int main(){string str1="aa",str2="aaa",str3="abc",str4="xyz";if(str1<str2){printf("ok1\n");}if(str1!=str3){printf("ok2\n");}if(str4>=str3){printf("ok3\n");}return 0;
}

(3)length()/size()

length()返回string的长度,即存放的字符数,时间复杂度为O\left ( 1 \right )。size()与length()基本相同。

string str="abcxyz";
printf("%d %d\n",str.length(),str.size());

(4)insert()

string的insert()函数有很多种写法,这里给出几个常用的写法,时间复杂度为O\left ( N \right )

1.insert(pos,string),在pos号位置插入字符串string

string str="abcxyz",str2="opq";
str.insert(3,str2);

输出结果

abcopqxyz

2.insert(it,it2,it3)

it为原字符串的欲插入位置,it2和it3为待插字符串的首尾迭代器,用来表示串[it2,it3)将被插在it的位置上。

#include<iostream>
#include<string>
using namespace std;
int main(){string str="abcxyz",str2="opq";//在str的3号位(即c和x之间)插入str2 str.insert(str.begin()+3,str2.begin(),str2.end());cout<<str<<endl;return 0;
}

(5)erase()

erase()有两种用法:删除单个元素,删除一个区间内的所有元素,时间复杂度均为O\left ( N \right )

1.删除单个元素

str.erase()用于删除单个元素,it为需要删除的元素的迭代器

#include<iostream>
#include<string>
using namespace std;
int main(){string str="abcdefg";str.erase(str.begin()+4);cout<<str<<endl;return 0;
} 

输出结果

abcdfg

2.删除一个区间内的所有元素

删除一个区间内的所以元素有两种方法:

str.erase(first,last),其中first为需要删除的区间的起始迭代器,而last则为需要删除的区间的末尾迭代器的下一个地址,也即为删除[first,last)

#include<iostream>
#include<string>
using namespace std;
int main(){string str="abcdefg";str.erase(str.begin()+2,str.end()-1);cout<<str<<endl;return 0;
}

输出结果 

abg

str.erase(pos,length),其中pos为需要开始删除的起始位置,length为删除的字符个数。

#include<iostream>
#include<string>
using namespace std;
int main(){string str="abcdefg";str.erase(3,2);cout<<str<<endl;return 0;
}

输出结果

abcfg

(6)clear() 

clear()用以清空string中的数据,时间复杂度一般为O\left ( 1 \right )

#include<stdio.h>
#include<string>
using namespace std;
int main(){string str="abcd";str.clear();printf("%d\n",str.length());return 0;
}

(7)substr()

substr(pos,len)返回从pos号位开始,长度为len的子串,时间复杂度为O\left ( len \right )

#include<iostream>
#include<string>
using namespace std;
int main(){string str="Thank you for your smile.";cout<<str.substr(0,5)<<endl;cout<<str.substr(14,4)<<endl;cout<<str.substr(19,5)<<endl;return 0;
} 

输出结果

Thank
your
smile

(8)string::npos

string::npos是一个常数,其本身的值为-1,但由于是unsigned_int类型,因此实际上也可以认为是unsigned_int类型的最大值。string::npos用以作为find函数失配时的返回值。例如在下面的实例中可以认为string::npos等于-1或者4294967295.

#include<iostream>
#include<string>
using namespace std;
int main(){if(string::npos==-1){cout<<"-1 is true."<<endl;}if(string::npos==4294967295){cout<<"4294967295 is also true."<<endl;}return 0;
}

输出结果

-1 is true.
4294967295 is also true.

(9)find()

str.find(str2),当str2是str的子串时,返回其在str中第一次出现的位置;如果str2不是str的子串,那么返回string::npos

str.find(str2,pos),从str的pos号位开始匹配str2,返回值与上相同。

时间复杂度为O\left ( nm \right ),其中n和m分别是str和str2的长度。

#include<iostream>
#include<string>
using namespace std;
int main(){string str="Thank you for your smile.";string str2="you";string str3="me";if(str.find(str2)!=string::npos){cout<<str.find(str2)<<endl;}if(str.find(str2,7)!=string::npos){cout<<str.find(str2,7)<<endl;}if(str.find(str3)!=string::npos){cout<<str.find(str3)<<endl;}else{cout<<"I know there is no position for me."<<endl;}return 0;
}

输出结果

6
14
I know there is no position for me.

(10)replace()

str.replace(pos,len,str2)把str从pos号位开始,长度为len的子串替换为str2

str.replace(it1,it2,str2)把str的迭代器[it1,it2)范围的子串替换为str2

#include<iostream>
#include<string>
using namespace std;
int main(){string str="Maybe you will turn around.";string str2="will not";string str3="surely";cout<<str.replace(10,4,str2)<<endl;cout<<str.replace(str.begin(),str.begin()+5,str3)<<endl;return 0;
}

输出结果

Maybe you will not turn around.
surely you will not turn around.

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

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

相关文章

Vue3+vite项目中使用mock模拟接口

安装依赖 分别安装vite-plugin-mock跟mockjs两个插件 npm install -D vite-plugin-mock mockjs vite.config.ts中添加配置&#xff0c;主要是红色标记的配置 注意此处如果配置出错可能是vite-plugin-mock依赖的版本有问题&#xff0c;重新安装一下依赖指定版本即可&#xf…

Pytorch环境配置2.0.1+ Cuda11.7

查找cuda、cudnn、Pytorch(GPU)及cuda和NVIDIA显卡驱动对应关系 查询可支持的最高cuda版本 nvidia-smi查看支持的cuda的版本 CUDA版本对应表 我的显卡驱动是Driver Version&#xff1a;535.40.&#xff0c;那么左边对应的CUDA都可以兼容 右上角为CUDA 版本&#xff0c;可以看…

Ubuntu配置Git

安装git sudo apt install git 查看是否安装成功 git --version 配置git 用github上注册的用户名和邮箱地址&#xff0c;配置git git config --global user.name "username" git config --global user.email "usernameemail.com" 重启ubuntu查看…

Collection(一)[集合体系]

说明&#xff1a;Collection代表单列集合&#xff0c;每个元素&#xff08;数据&#xff09;只包含一个值。 Collection集合体系&#xff1a; Collection<E> 接口 (一&#xff09;List<E> 接口 说明&#xff1a;添加的元素是有序、可重复、有索引。 1. ArrayLi…

vue3中的toRaw API

文章目录 什么是toRaw API&#xff1f;为什么需要toRaw&#xff1f;如何使用toRaw&#xff1f;实际应用场景 这两天在写项目的时候&#xff0c;发现了一个之前没用过的api&#xff0c;于是上网查了一下&#xff0c;发现这个api还是挺常用&#xff0c;所以在这记录一下 什么是t…

【Postman接口测试】第二节.Postman界面功能介绍(上)

文章目录 前言一、Postman前言介绍二、Postman界面导航说明三、使用Postman发送第一个请求四、Postman 基础功能介绍 4.1 常见类型的接口请求 4.1.1 查询参数的接口请求 4.1.2 表单类型的接口请求 4.1.3 上传文件的表单请求 4.1.4 JSON 类…

HCIP-Datacom-ARST自选题库__BGP/MPLS IP VPN简答【3道题】

1.在BGP/MPLSIPVPN场景中&#xff0c;如果PE设备收到到达同一目的网络的多条路由时&#xff0c;将按照定的顺序选择最优路由。请将以下内容按照比较顺序进行排序。 2.在如图所示的BGP/MPLSIP VPN网络中&#xff0c;管理员准备通过Hub-Spoke组网实现H站点对VPM流量的集中管控&am…

C# 配置文件设置详解

文章目录 1. 配置文件在 C# 项目中的作用和重要性2. 不同类型的配置文件app.configconfig.exejson 3. 创建和修改配置文件文件位置添加内容修改内容保存和加载 4. 读取和写入配置文件app.config 文件读取config.exe 文件写入JSON 文件读写 5. 示例代码演示6. 配置文件在安全性方…

【kubernetes】关于k8s集群的污点、容忍、驱逐以及k8s集群故障排查思路

目录 一、污点(Taint) 1.1污点介绍 1.2污点的组成格式 1.3当前 taint effect 支持如下三个选项&#xff1a; 1.4污点的增删改查 1.4.1验证污点的作用——NoExecute 1.4.2验证污点的作用——NoSchedule 1.4.3 验证污点的作用——PreferNoSchedule 1.5污点的配置与管理…

php反序列化学习(1)

1、php面向对象基本概念 类的定义&#xff1a; 类是定义了一件事物的抽象特征&#xff0c;它将数据的形式以及这些数据上的操作封装住在一起。&#xff08;对象是具有类类型的变量&#xff0c;是对类的实例&#xff09; 构成&#xff1a; 成员变量&#xff08;属性&#xf…

基于开源项目HAL STM32F4 +DSP库跑SVPWM开环速度测试

HAL STM32F4 ARM DSP库跑SVPWM开环速度测试 ✨本篇硬件电路和代码来源于此开源项目&#xff1a;https://github.com/MengYang-x/STM3F401-FOC/tree/main&#x1f4cd;硬件电路和项目介绍&#xff0c;立创开源广场&#xff1a;https://oshwhub.com/shadow27/tai-yang-neng-wu-re…

走进智慧仓储:3D可视化工厂园区革新物流新纪元

在快节奏的现代生活中&#xff0c;物流仓储行业扮演着至关重要的角色。随着科技的飞速发展&#xff0c;传统仓储模式正面临一场前所未有的变革。今天&#xff0c;就让我们一起看看3D可视化技术如何为物流行业带来前所未有的便利与效率。 什么是3D可视化工厂园区&#xff1f; 3…

【最新区块链论文录用资讯】CCF A—INFOCOM 2024 共17篇

Conference&#xff1a;IEEE International Conference on Computer Communications CCF level&#xff1a;CCF A Categories&#xff1a;计算机网络 Year&#xff1a;2024 Num&#xff1a;17 A Generic Blockchain-based Steganography Framework with High Capacity via …

Python: 使用pyotp实现OTP一次性密码验证

使用pyotp实现OTP一次性密码验证 OTP的基本原理 生成一个共享秘钥作为随机数的种子服务端通过种子计算出当前的密码客户端也通过相同的种子计算出当前的密码验证客户端生成的密码和服务端生成的密码是否匹配 服务端和客户端计算的方式一样 共享密钥 时间因子 算法 > 密…

多个文本如何一键导出二维码?在线批量生码的制作方法

当存在多条文本数据并且需要将每条数据生成单独的二维码来使用&#xff0c;很多小伙伴可能还在用一个一个来制作的方法&#xff0c;在二维码生成器上将文本转二维码。这种方式操作起来比较的繁琐&#xff0c;需要浪费大量的时间&#xff0c;那么有什么方法可以简化这个过程吗&a…

YOLOv10代码详细介绍(附录训练教程和权重)

前言 YOLOv10 是清华大学研究人员在 UltralyticsPython 清华大学的研究人员在 YOLOv10软件包的基础上&#xff0c;引入了一种新的实时目标检测方法&#xff0c;解决了YOLO 以前版本在后处理和模型架构方面的不足。通过消除非最大抑制&#xff08;NMS&#xff09;和优化各种模型…

[从零开发JS应用] 如何在VScode中配置Javascript环境,常见的调试方法有哪些?

一、安装VSCode和Node.js 记录环境配置&#xff1a;本文配置的环境主要针对单独JS文件的断点调试&#xff0c;主要是为了调试LeetCode里面的代码。 首先在官网下载对应的版本&#xff1a;https://nodejs.org/en/ 开始安装&#xff0c;可以自定义选择安装路径。 这里选择Add Pa…

【亲测,安卓版】快速将网页网址打包成安卓app,一键将网页打包成app,免安装纯绿色版本,快速将网页网址打包成安卓apk

背景&#xff1a;部分客户需求将自己网站打包成app&#xff0c;供用户在浏览器安装使用、 网页网址快速生成app 准备材料操作流程第一步&#xff1a;打开HBuilder X新建项目第二步创建Wap2App项目第三步修改App图标第四步发布app第五步查看apk 准备材料 1.需要打包的网页 2.ap…

页面加载不出来,报错[@umijs/runtime] load component failed

问题描述 页面加载不出来数据&#xff0c;一直在旋转&#xff0c;控制台输出内容如下&#xff1a; 原因分析&#xff1a; 之前页面是没有问题的&#xff0c;在写当前页面突然出现页面加载不出来&#xff0c;控制台报错&#xff0c;主要是页面引入了这行代码报错 import { …

MX Component基础使用(多点位读取,多点位写入)

步骤&#xff0c;先连接PLC&#xff0c;然后在填入对应的点位 D10 然后去读取。 using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;us…