STL常用容器—string容器

STL常用容器—string容器

  • string基本概念
  • string初始化及赋值
    • 1. 构造函数原型
    • 2. 字符串赋值
    • 3. 字符串拼接
  • string字符存取(遍历)
  • 字符串的查找和替换
  • 字符串比较
  • string取子串
  • 字符串删除和插入
  • string与char *类型的转化

string基本概念

本质:

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

string和char * 区别:

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

特点:

  • string 类内部封装了很多成员属性和方法
  • string管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责

string初始化及赋值

1. 构造函数原型

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

示例:

string str = "hello world";
const char *str0 = "hello";
string str1;		// 创建空字符串,调用无参构造函数
string str2(str);	// 调用拷贝构造函数cout << str2 << endl;

2. 字符串赋值

C++内部已对operator=(const string &s)等一系列的=进行运算符重载,并且通过函数重载的方式实现支持将string类型、char *类型以及char 字符类型赋值给string字符串变量,可直接赋值,简洁明了。
示例:

string str = "hello world";
const char *str0 = "hello";
string str1;		// 创建空字符串,调用无参构造函数
str1 = str0;
cout << str1 << endl;
str1 = 's';
cout << str1 << endl;

assign方法赋值:
同时,string类型有赋值的方法assign,可以指定赋值前n个字符给目标字符,默认全部赋值,其中函数第一个参数为源字符串。
示例:

string str = "hello world";
string str1;		// 创建空字符串,调用无参构造函数
str1.assign("hello world",7);
cout << str1 << endl;

3. 字符串拼接

C++内部已对operator+(const string &s)等一系列的+进行运算符重载,并且通过函数重载的方式实现支持将string类型、char *类型以及char 字符类型字符串相加,可直接赋值,简洁明了。

string str1 = "hello";
string str2 = " world";
string str3;
str3 = str1 + str2;
cout << str3 << endl;

append方法拼接
同时,string类型有拼接的方法append,函数原型如下:

// 把字符串s连接到当前字符串结尾
string& append(const char *s); 	 
//字符串s中从pos开始的n个字符连接到字符串结尾
string& append(string &s, int pos, int n);

示例:

string str1 = "hello";
string str2 = " world";
string str3;
str3 = str1 + str2;
cout << str3 << endl;
str3.append(str2,0,3);
cout << str3 << endl;

string字符存取(遍历)

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

  • 通过 [ ] 方式获取字符
  • 通过 at 方法获取字符

获取字符串长度:利用字符串 size( ) 方法
示例:

void test()
{string str = "hello world!";int i = 0;//通过[]遍历字符串 for(i = 0; i < str.size(); i++)cout << str[i];cout << endl;//通过at()方法遍历字符串 for(i = 0; i < str.size(); i++)cout << str.at(i);cout << endl;//对字符串特定字符赋值 str[0] = 'x';str.at(1) = 'x';cout << str << endl;
}

字符串的查找和替换

查找函数原型:

//查找str第一次出现位置, 从pos开始查,默认为0
int find(const string& str, int pos = 0)
//查找字符c第一次出现位置
int find(const char c, int pos = 0);                    

成功返回找到的下标,错误返回-1
示例:

//查找
string str1 = "abcdefgde";
int pos = str1.find("de");
if (pos == -1)cout << "未找到" << endl;
elsecout << "pos = " << pos << endl;

替换函数原型:

//从pos开始n个字符为字符串str
string& replace(int pos, int n, const string& str);   

示例:

//替换
string str1 = "abcdefgde";
str1.replace(1, 3, "1111");cout << "str1 = " << str1 << endl;

总结:

  • find查找是从左往后,rfind从右往左
  • find找到字符串后返回查找的第一个字符位置,找不到返回 -1
  • replace在替换时,要指定从哪个位置起,多少个字符,替换成什么样的字符串

字符串比较

  • 字符串比较是按字符的ASCII码进行对比,比较机制与返回值与C语言一样。

函数原型:

//与字符串s比较
int compare(const string &s) const; 

示例:

//字符串比较
void test()
{string str1 = "hello";string str2 = "aello";int ret = str1.compare(str2);if(ret == 0)cout << "s1 = s2" << endl;else if(ret > 0)cout << "s1 > s2" << endl;elsecout << "s1 < s2" << endl;
}

string取子串

  • 从字符串中获取想要的子串

函数原型:

//返回由pos开始的n个字符组成的字符串
string substr(int pos = 0, int n = npos);  

示例:

string str = "abcdefg";
string subStr = str.substr(1, 3);
cout << "subStr = " << subStr << endl;string email = "hello@sina.com";
int pos = email.find('@');			
string username = email.substr(0,pos);
cout << "username= " << username << endl;
string web = email.substr(pos+1, email.size()-pos);
cout << "web= " << web << endl;

案例:利用以上字符串操作,自定义实现strtok函数的功能

补充:strtok函数具体功能及参数与返回值

char *strtok(char *str, const char *delim);
  • 功能: 字符串切割
  • 参数:
    str: 当前要切割的字符串
    delim: 根据指定的字符串进行切割
  • 返回值:
    成功: 切割出来的字符
    失败: NULL
    切割完毕也返回NULL
vector<string>  my_strtok(string str)
{vector<string> v;int pos = 0;int begin = 0;string subStr; //cout << "src str=" << str << endl;while(1){pos = str.find(":",begin);if(pos == -1)break;subStr = str.substr(begin, pos-begin);v.push_back(subStr);//cout << "sub str=" << subStr << endl;begin = pos + 1;}subStr = str.substr(begin, str.size()-begin);//cout << "sub str=" << subStr << endl;v.push_back(subStr);return v;
}

通过find方法寻找需要分割的字符,并通过substr函数分割子串,最后将各个子串存入容器。

字符串删除和插入

  • 对string字符串进行插入和删除字符操作
    函数原型:
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个字符 

示例:

	string str = "hello";str.insert(1, "111");cout << str << endl;str.erase(1, 3);  	//从1号位置开始删除3个字符cout << str << endl;

string与char *类型的转化

char * 转 string(构造函数)

char *c_str = "hello world";
string str(c_str );

string 转 char * (c_str)

string str("hello world");
char *c_str = str.c_str();

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

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

相关文章

机器学习周刊第六期:哈佛大学机器学习课、Chatbot Ul 2.0 、LangChain v0.1.0、Mixtral 8x7B

— date: 2024/01/08 — 吴恩达和Langchain合作开发了JavaScript 生成式 AI 短期课程&#xff1a;《使用 LangChain.js 构建 LLM 应用程序》 大家好&#xff0c;欢迎收看第六期机器学习周刊 本期介绍10个内容&#xff0c;涉及Python、机器学习、大模型等,目录如下&#xff…

Miracast手机高清投屏到电视(免费)

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Miracast概述 Miracast是一种无线显示标准&#xff0c;它允许支持Miracast的设备之间通过Wi-Fi直接共享音频和视频内容&#xff0c;实现屏幕镜像或扩展显示。这意味着你可以…

C++常用类

1、QString 字符串类 QString 是Qt的字符串类&#xff0c;与C的std::string相比&#xff0c;不再使用ASCII编码。QString使用的Unicode编码。 QString 完全支持中文&#xff0c; 但是由于不同的技术可能会采用不同的编码。有时候也会遇到中文编码的一致性问题。 如果后续的学习…

PointMixer: MLP-Mixer for Point Cloud Understanding

Abstract MLP-Mixer 最近崭露头角,成为对抗CNNs和Transformer领域的新挑战者。尽管相比Transformer更为简单,但通道混合MLPs和令牌混合MLPs的概念在图像识别任务中取得了显著的性能。与图像不同,点云本质上是稀疏、无序和不规则的,这限制了直接将MLP-Mixer用于点云理解。为…

i18n多国语言Internationalization的实现

i18n 是"Internationalization”的缩写&#xff0c;这个术语来源于英文单词中首尾字母“”和“n”以及中间的字符数(共计18个字符) 当我们需要开发不同语言版本时&#xff0c;就可以使用i18n多国语言的一个操作处理&#xff0c;i18n主要实现那一方面的内容呢&#xff1f;…

项目压测优化实践思路

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术&#x1f525;如果感觉博主的文章还不错的…

BGP防环机制介绍

点赞 关注&#xff0c;持续更新&#xff01;&#xff01;&#xff01;&#xff01; BGP防环机制有以下两种&#xff08;此处不谈带RR的场景&#xff09;&#xff1a; 一、AS_PATH 在AS之间实现BGP环路的防范&#xff0c;从EBGP邻居得到路由时&#xff0c;检查该路由的AS_PA…

日本樱岛火山喷发遥感卫星影像监测

日本樱岛火山喷发监测 当地时间2024年1月9日15时许&#xff0c;位于日本九州地区鹿儿岛县的樱岛南岳山顶火山口&#xff0c;开始喷发&#xff0c;火山烟雾从火山口上升至空中1200米左右。目前&#xff0c;日本气象厅将樱岛的火山警戒级别维持在3级&#xff0c;限制民众入山。 火…

前端浮点和16进制互转

一、浮点转16进制数据 //浮点数转16进制 function singleToHex(t) {if (t "") {return "";}t parseFloat(t.substr(0, 4));if (isNaN(t) true) {return "Error";}if (t 0) {return "00000000";}var s,e,m;if (t > 0) {s 0;}e…

HCS私有云简介

1、HCS简介和发展史 华为云产品&#xff1a;私有云和公有云&#xff0c;现在的私有云已经和公有云越来越像了FusionSphere是华为的一个品牌2016年&#xff0c;在5.0版本的时候&#xff0c;华为Openstack叫FusionSphere Openstack 5.0&#xff0c;底层用的是suse操作系统&#…

整数因子分解问题(分治法欧拉线性筛素数)

问题描述&#xff1a; 大于1 的正整数n 可以分解为&#xff1a;nx1*x2*…*xm。 例如&#xff0c;当n12 时&#xff0c;共有8 种不同的分解式&#xff1a; 1212&#xff1b; 126*2&#xff1b; 124*3&#xff1b; 123*4&#xff1b; 123*2*2&#xff1b; 122*6&#xff1…

BitLocker 驱动器加密

BitLocker 简介 BitLocker 驱动器加密是一项由微软开发并集成在Windows操作系统中的数据保护功能&#xff0c;其主要作用是通过加密存储在硬盘驱动器上的数据来增强信息安全。具体来说&#xff1a; 数据安全&#xff1a;BitLocker可以对整个操作系统卷&#xff08;包括系统分区…

开源图床Lychee本地如何部署并结合内网穿透工具实现远程访问

文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 图床作为图片集中存放的服务网站&#xff0c;可以看做是云存储的一部分&#xff0c;既可…

酒店订房小程序源码系统:帮您打造类似美团的酒店模式的小程序 带完整的安装部署教程

随着移动互联网的快速发展&#xff0c;小程序已经成为一种新型的应用形态&#xff0c;为各大行业提供了更加便捷的服务。其中&#xff0c;酒店预订小程序作为一种方便快捷的预订方式&#xff0c;备受用户青睐。小编给大家分享一款酒店订房小程序源码系统&#xff0c;旨在帮助您…

中霖教育:中级会计师报名条件是什么?

一、学历要求 报考中级会计师的考生需要具备大专及以上学历&#xff0c;如果不满足学历要求是无法报考的。 二、工作经验要求 报考中级会计师的考生需要具备一定的工作经验。根据规定&#xff0c;不同的学历对从业年限要求不同&#xff0c;主要有以下几种情况&#xff1a; …

多租户体系实现

文章目录 核心思路方案选择设计考量安全性扩展性通用性易用性 具体实现租户信息透传透传变量名命名规范应用内透传应用间透传 数据层租户隔离MySQL存储方案&#xff1a;多租户Mybatis插件Mybatis插件特点使用多租户Mybatis插件的优势参考文档 应用场景 经过工作中的一处场景启发…

机器学习周刊第五期:一个离谱的数据可视化Python库、可交互式动画学概率统计、机器学习最全文档、快速部署机器学习应用的开源项目、Redis 之父的最新文章

date: 2024/01/08 这个网站用可视化的方式讲解概率和统计基础知识,很多内容还是可交互的,非常生动形象。 大家好,欢迎收看第五期机器学习周刊 本期介绍7个内容,涉及Python、概率统计、机器学习、大模型等,目录如下: 一个离谱的Python库看见概率,看见统计2024机器学习最…

U盘提示未格式化解决方法超级简单

U盘提示未格式化是常见故障&#xff0c;主要原因有文件系统损坏、固件问题、物理故障等。解决方法包括格式化U盘、更新固件、恢复数据等&#xff0c;具体操作需根据故障原因选择。如无法解决&#xff0c;建议联系专业维修人员处理。 U盘提示未格式化解决方法超级简单 当U盘提示…

使用scipy处理图片——滚动图片

大纲 常规模式constant和grid-constant 交换模式wrap和grid-wrap 镜像reflect、mirror和grid-mirror 最近值nearest 代码 在《使用numpy处理图片——滚动图片》一文中&#xff0c;我们介绍了numpy的roll方法&#xff0c;它只能让超出区域的元素回到被移动的区域中&#xff0c;如…

置位复位寄存器的某一位(多工位多工站渗透线控制应用)

这里的置位复位特定寄存器位功能块可以应用在渗透线控制应用上,我们可以根据小车当前所在位置,对相关工作槽里的标志位进行置位复位等操作(某个槽有产品,某个槽没有产品等)。 下面我们看下对应的控制要求 1、置位复位特定的位 2、置位复位寄存器中的某一位 3、置位bit8 4…