【C++】STL(二) string容器

news2024/11/16 4:21:05

一、string基本概念

1、本质

string是C++风格的字符串,而string本质上是一个类

string和char * 区别:
char * 是一个指针
string是一个,类内部封装了char*,管理这个字符串,是一个char*型的容器。

2、特点

1、string 类内部封装了很多成员方法
(例如:查找find,拷贝copy,删除delete 替换replace,插入insert)
2、string管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责

3、string构造函数

① string构造函数原型

string(); // 创建一个空的字符串 例如:string str;
string(const char * s); // 使用字符串s初始化
string(const string & str); // 使用一个string对象初始化另一个string对象
string(int n,char c); //使用n个字符c初始化

② string的多种构造方式没有可比性,灵活使用即可。

例子

#include <iostream>
using namespace std;
#include<string> 

//string的构造函数

/*
构造函数原型:
    string();                   //创建一个空的字符串 例如: string str;
    string(const char* s);      //使用字符串s初始化
    string(const string& str);  //使用一个string对象初始化另一个string对象
    string(int n, char c);      //使用n个字符c初始化
*/

void stringtest01()
{
    string s1; //默认构造 就是空字符串

    const char *str = "lalalala";
    string s2(str); //使用字符串 s 初始化

    string s3(s2);

    string s4(5, 'a');

    cout << "s2 = " << s2 << endl;
    cout << "s3 = " << s3 << endl;
    cout << "s4 = " << s4 << endl;
}


int main()
{
    stringtest01();

    system("pause");

    return 0;
}

在这里插入图片描述

2.3 string赋值操作

① 给string字符串进行赋值。
② 赋值的函数原型

赋值的函数原型:
    string& operator=(const char* s);       //char*类型字符串 赋值给当前的字符串
    string& operator=(const string &s);     //把字符串s赋给当前的字符串
    string& operator=(char c);              //字符赋值给当前的字符串
    string& assign(const char *s);          //把字符串s赋给当前的字符串
    string& assign(const char *s, int n);   //把字符串s的前n个字符赋给当前的字符串
    string& assign(const string &s);        //把字符串s赋给当前字符串
    string& assign(int n, char c);          //用n个字符c赋给当前字符串

③ string的赋值方式很多,operator=这种方式是比较常用的。

例子

void stringtest02()
{
    string s1 = "cgslbdfapofclaujbrank!";
    cout << "s1 = " << s1 << endl;

    string s2;
    s2 = s1;    //把字符串s赋给当前的字符串
    cout << "s2 = " << s2 << endl;

    string s3;
    s3 = 'a';    //字符赋值给当前的字符串
    cout << "s3 = " << s3 << endl;

    string s4;
    s4.assign("vvvvvvvv");
    cout << "s4 = " << s4 << endl;

    string s5;
    s5.assign("abcdefghijklmn", 5);
    cout << "s5 = " << s5 << endl;

    string s6;
    s6.assign(s5);
    cout << "s6 = " << s6 << endl;

    string s7;
    s7.assign(9, 'a');
    cout << "s7 = " << s7 << endl;
}
int main()
{
    stringtest02();

    system("pause");

    return 0;
}

在这里插入图片描述

2.4 string字符串拼接— 实现在字符串末尾拼接字符串

① 实现在字符串末尾拼接字符串。

② 函数原型:

字符串拼接函数原型:
    string& operator+=(const char* str);              //重载+=操作符
    string& operator+=(const char c);                 //重载+=操作符
    string& operator+=(const string& str);            //重载+=操作符
    string& append(const char *s);                    //把字符串s连接到当前字符串结尾
    string& append(const char *s, int n);             //把字符串s的前n个字符连接到当前字符串结尾
    string& append(const string &s);                  //同operator+=(const string& str)
    string& append(const string &s, int pos, int n);  //字符串s中从pos开始的n个字符连接到字符串结尾

例子

void stringtest03()
{
    string s1 = "I";
    s1 += "abcd";
    cout << "s1 = " << s1 << endl;

    s1 += ':';
    cout << "s1 = " << s1 << endl;

    string s2 = "LKMN";
    s1 += s2;
    cout << "s1 = " << s1 << endl;

    s1.append("qwer");
    cout << "s1 = " << s1 << endl;

    s1.append("ty:uiop", 3);
    cout << "s1 = " << s1 << endl;

    s1.append(s2);
    cout << "s1 = " << s1 << endl;

    s1.append(s2, 1, 3);// 从下标1位置开始 ,截取3个字符,拼接到字符串末尾
    cout << "s1 = " << s1 << endl;
}
int main()
{
    stringtest03();

    system("pause");

    return 0;
}

在这里插入图片描述

2.5 string字符串查找和替换

① 查找:查找指定字符串是否存在。

② 替换:在指定的位置替换字符串。

③ 函数原型:

函数原型:
    int find(const string& str, int pos = 0) const;      //查找str第一次出现位置,从pos开始查找
    int find(const char* s, int pos = 0) const;          //查找s第一次出现位置,从pos开始查找
    int find(const char* s, int pos, int n) const;       //从pos位置查找s的前n个字符第一次位置
    int find(const char c, int pos = 0) const;           //查找字符c第一次出现位置

    int rfind(const string& str, int pos = npos) const;  //查找str最后一次位置,从pos开始查找
    int rfind(const char* s, int pos = npos) const;      //查找s最后一次出现位置,从pos开始查找
    int rfind(const char* s, int pos, int n) const;      //从pos查找s的前n个字符最后一次位置
    int rfind(const char c, int pos = 0) const;          //查找字符c最后一次出现位置

    string& replace(int pos, int n, const string& str);  //替换从pos开始n个字符为字符串str
    string& replace(int pos, int n,const char* s);       //替换从pos开始的n个字符为字符串s

④ find查找是从左往右,rfind从右往左。

⑤ find找到字符串后返回查找的第一个字符位置,找不到返回-1。

⑥ replace在替换时,要知道从哪个位置起,多少个字符,替换成什么样的字符串。

例子

void stringtest04()
{
    string s1 = "abcdefabcimnlkabcmnrsabcqrst";
    int pos = (int)s1.find("bc");
    cout << "找到字符串,位置POS : " << pos << endl;

    pos = (int)s1.rfind("bc");
    cout << "找到字符串,位置POS : " << pos << endl;

    s1.replace(1, 3, "1111");    //从1号位置起后面4个字符替换为 1111 
    cout << "S1 = " << s1 << endl;
}
int main()
{
    stringtest04();

    system("pause");

    return 0;
}

在这里插入图片描述

2.6 string字符串比较

① 功能描述:字符串之间比较。

② 比较方式:字符串比较是按字符的ASCII码进行对比。

比较方式:
    字符串比较是按字符的ASCII码进行对比
    = 返回 0
    > 返回 1
    < 返回 -1

③ 函数原型:


函数原型:
    int compare(const string &s) const; //与字符串s比较
    int compare(const char *s) const;   //与字符串s比较

例子

void stringtest05()
{
    string s1 = "abcdefg";
    string s2;
    s2.assign(s1);
    string s3 = "sddfghh";
    cout << "s1 : " << s1 << endl;
    cout << "s2 : " << s2 << endl;
    cout << "s3 : " << s3 << endl;

    int ret = s1.compare(s2);
    cout << "S1 & S2 比较结果 : " << ret << endl;

    ret = s1.compare(s3);
    cout << "S1 & S3 比较结果 : " << ret << endl;
}

在这里插入图片描述

2.7 string字符串存取

① string中单个字符存取方式有两种:

string中单个字符存取方式有两种
    char& operator[](int n);     //通过[]方式取字符
    char& at(int n);             //通过at方法获取字符

例子

void stringtest06()
{
    string s1 = "abcdefg";
    cout << "s1 = " << s1 << endl;

    for (int i = 0; i < s1.size(); i++)
    {
        cout << s1[i] << " " << endl;
    }

    char c = s1.at(3);//通过at方法获取字符
    cout << "第3个字符为: " <<c << endl;

    //通过上述两种方式修改字符串值
    s1[0] = 'x';
    cout << "s1 = " << s1 << endl;

    s1.at(3) = 'x';
    cout << "s1 = " << s1 << endl;
}

在这里插入图片描述

2.8 string字符串插入和删除

① 功能描述:对string字符串进行插入和删除字符操作。

② 函数原型:

函数原型:
    string& insert(int pos, const char* s);      //插入字符串
    string& insert(int pos, const string& str);  //插入字符串
    string& insert(int pos, int n, char c);      //在指定位置插入n个字符c

    string& erase(int pos, int n = npos);        //删除从Pos开始的n个字符
*/

③ 插入和删除的起始下标都是从0开始。

例子

void stringtest07()
{
    string s1 = "abcdefg";
    cout << "s1 = " << s1 << endl;

    s1.insert(2, "WWW");
    cout << "s1 = " << s1 << endl;

    s1.erase(2, 3);
    cout << "s1 = " << s1 << endl;
}

在这里插入图片描述

2.9 string子串获取

① 功能描述:从字符串中获取想要的子串。

② 函数原型:

函数原型:
    string substr(int pos = 0, int n = npos) const; //返回由pos开始的n个字符组成的字符串
*/

③ 灵活的运用求子串功能,可以在实际开发中获取有效的信息。

例子

void stringtest08()
{
    string s1 = "abcdefg";
    cout << "s1 = " << s1 << endl;

    string s2 = s1.substr(2, 3);
    cout << "s2 = " << s2 << endl;

    //截取邮箱名字
    string email = "dzl_emails@163.com";
    int pos = (int)email.find('@'); //找到 @ 符号位置
    string UserName = email.substr(0, pos);    //从位置0到pos位置间,就是邮箱名字,可以使用子串返回
    cout << "UserName : " << UserName << endl;
}

在这里插入图片描述

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

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

相关文章

PyCM:Python中的混淆矩阵库

PyCM&#xff1a;Python中的混淆矩阵库 在机器学习和数据科学领域&#xff0c;评估模型的性能是至关重要的。混淆矩阵是一种常用的评估工具&#xff0c;用于可视化和量化分类模型的预测结果。PyCM是一个开源的Python库&#xff0c;提供了丰富的功能来计算和分析混淆矩阵。本文将…

rancher是什么

Rancher Labs是制作Rancher的公司。Rancher Labs成立于2014年&#xff0c;是一家专注于企业级容器管理软件的公司。它的产品设计旨在简化在分布式环境中部署和管理容器的过程&#xff0c;帮助企业轻松地采用容器技术和Kubernetes。Rancher Labs提供的Rancher平台支持Docker容器…

Java网络编程详解

目录 网络编程 1、概述 2、网络通信的要素 3、IP 4、端口 5、通信协议 6、TCP 文件上传 Tomcat 7、UDP 单方发送单方接受 双方发送接收 8、URL URL测试 URL下载网络资源 网络编程 1、概述 信件&#xff1a; 计算机网络&#xff1a; 计算机网络是指将地理位置不…

刘敏:楼氏动铁和麦克风助力听力健康技术发展 | 演讲嘉宾公布

一、助辅听器材Ⅱ专题论坛 助辅听器材Ⅱ专题论坛将于3月28日同期举办&#xff01; 听力贯穿人的一生&#xff0c;听觉在生命的各个阶段都是至关重要的功能&#xff0c;听力问题一旦出现&#xff0c;会严重影响生活质量。助辅听器材能有效提高生活品质。在这里&#xff0c;我们将…

FLatten Transformer_ Vision Transformer using Focused Linear Attention

paper: https://arxiv.org/abs/2308.00442 code: https://github.com/LeapLabTHU/FLatten-Transformer 摘要 当将transformer模型应用于视觉任务时&#xff0c;自注意的二次计算复杂度( n 2 n^2 n2)一直是一个持续存在的挑战。另一方面&#xff0c;线性注意通过精心设计的映射…

AI会砸了我们的饭碗?

Sora&#xff0c;由OpenAI推出&#xff0c;是一款创新的文本到视频生成模型。它能够将文本描述转化为引人入胜的高清视频片段。采用了扩散模型和变换器架构&#xff0c;Sora实现了高效的训练。其方法包括统一表示法、基于补丁的表示法、视频压缩网络和扩散变换器。 Sora具备多种…

数据分析-Pandas如何画图验证数据随机性

数据分析-Pandas如何画图验证数据随机性 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表…

【git bug】warning: auto-detection of host provider took too long (>2000ms)

【git bug】warning: auto-detection of host provider took too long (>2000ms) 报错问题&#xff1a; warning: auto-detection of host provider took too long (>2000ms) 报错截图&#xff1a; 报错描述&#xff1a; 在windows操作系统&#xff0c;未连接互连网电…

Docker初体验之安装部署和镜像加速(openeuler版)

安装部署&#xff1a; 本人使用的为openeuler版本&#xff0c;无法使用二进制进行安装&#xff08;使用二进制安装时&#xff0c;无法使用docker中的补全命令&#xff0c;需要重新进行配置&#xff09;在此使用yum直接进行安装。 [rootlocalhost ~]# yum install docker 镜像…

CKB转型为BTC Layer2后月涨超 300%,还有哪些转型热门赛道的老项目?

虽然说牛市下&#xff0c;炒新不炒旧。但一些渡过漫长熊市的老牌项目方&#xff0c;重新回到牌桌前开始新叙事后&#xff0c;市场依然有人买单。 部分项目方已经初步尝到了甜头&#xff0c;Arweave&#xff08;AR&#xff09;宣布从去中心化数据存储转换到「以太坊杀手」后&am…

STM32CubeMX学习笔记20——SD卡FATFS文件系统

1. FATFS文件系统简介 文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构&#xff08;即在存储设备上组织文件的方法&#xff09;。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统&#xff0c;简称文件系统&#xff1b;不带文件系统的SD卡仅能…

论文:CLIP(Contrastive Language-Image Pretraining)

Learning Transferable Visual Models From Natural Language Supervision 训练阶段 模型架构分为两部分&#xff0c;图像编码器和文本编码器&#xff0c;图像编码器可以是比如 resnet50&#xff0c;然后文本编码器可以是 transformer。 训练数据是网络社交媒体上搜集的图像…

数据结构---复杂度(2)

1.斐波那契数列的时间复杂度问题 每一行分别是2^0---2^1---2^2-----2^3-------------------------------------------2^(n-2) 利用错位相减法&#xff0c;可以得到结果是&#xff0c;2^(n-1)-1,其实还是要减去右下角的灰色部分&#xff0c;我们可以拿简单的数字进行举例子&…

Halcon测量专栏-圆弧测量

1.前言 1.1什么是圆弧 圆上任意两点间的部分叫做圆弧。由于圆弧有正反的特性&#xff0c;即为有顺时针方向和逆时针方向&#xff0c;在确定圆弧时&#xff0c;也需要确定圆弧的方向。 1.2halcon实现方式 针对圆弧的问题。1&#xff1a;它与圆是相似的&#xff0c;都具备中心…

(完美方案)解决mfc140u.dll文件丢失问题,快速且有效的修复

唉&#xff0c;又是丢失了mfc140u.dll&#xff0c;这该怎么办呢&#xff1f;如果你的电脑突然找不到或丢失mfc140u.dll文件&#xff0c;那就真是太糟糕了。别担心&#xff0c;我分享给你一些干货&#xff0c;告诉你如何快速解决mfc140u.dll丢失的问题。 一.mfc140u.dll属性功能…

分布式之Ribbon使用以及原理

Ribbon使用以及原理 1、负载均衡的两种方式 服务器端负载均衡 传统的方式前端发送请求会到我们的的nginx上去&#xff0c;nginx作为反向代理&#xff0c;然后路由给后端的服务器&#xff0c;由于负载均衡算法是nginx提供的&#xff0c;而nginx是部署到服务器端的&#xff0c;所…

数据结构入门(3)2.链表接口实现

目录 前言 头文件 动态申请一个结点 单链表打印 单链表尾插 单链表的头插 单链表的尾删 单链表头删 单链表查找 单链表在pos位置之后插入x 单链表删除pos位置之后的值 在pos的前面插入 删除pos位置 销毁顺序表 前言 本文将介绍链表常见的功能的实现 头文件 #…

【Java】仓库管理系统 SpringBoot+LayUI+DTree(源码)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

【APB协议 UVM_Sequencer Driver Monitor_2024.03.04】

apb协议 写时序 地址、写信号、PSEL、写数据信号同时发生变化&#xff0c;即传输的第一个时钟被称为SETUP周期。在下个时钟上升沿,PENABLE信号拉高&#xff0c;表示ENABLE周期&#xff0c;在该周期内&#xff0c;数据、地址以及控制信号都必须保持有效。整个写传输在这个周期…

【Java常用API】正则表达式的基础使用

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…