C++ STL -->string类

文章目录

  • STL
    • 什么是STL
  • String类
    • string类对象的构造方式
    • string类对象的容量操作
    • string类对象的访问及遍历操作
      • string迭代器函数遍历类对象
    • stirng类对象的修改操作
    • string类非成员函数

STL

什么是STL

STL全称standard template libaray-标准模板库 是C++标准库的重要组成部分 不仅是一个可复用的组件库 更是一个保罗数据结构与算法的软件框架
STL是C++中的优秀的作品 有了它 许多底层数据结构以及算法都不需要自己重新造轮子 直接站在巨人的肩膀上 健步如飞快速进行开发

String类

标准库中的string类string类的文档介绍

string类对象的构造方式

string类实现了多个构造函数的重载 常用的构造函数有:
在这里插入图片描述
示例:

string s1();//构造空的string类对象 即空字符串s1
string s2("Hello stirg"); //用常量字符串构造string类对象s2
string s3(10, 'x');//用10个x构造string类对象s3
string s4(s2);//用s2 拷贝构造s4

string类对象的容量操作

在这里插入图片描述

  1. size函数:返回字符串有效字符长度 不算\0
// size_t size() const; 函数接口
string s2("Hello string");
cout << s2.size() << endl;//12
  1. length函数:和size函数一样 返回字符串有效的字符长度
    两者没区别引入size()的原因是为了与其他容器的接口保持一 致,一般情况下基本都是用size()。
//size_t length() const;函数接口
string s2("Hello string");
cout << s2.length() << endl; //12
  1. max_size: 返回字符串的最大容量(没发现有什么用)
//size_t max_size() const; 函数接口
  1. resize: 改变当前对象的有效字符个数
//void resize (size_t n); 函数接口
//void resize (size_t n, char c); 函数接口
string s2("Hello string");
cout << s2.size() << endl;//12s2.resize(20);
cout << s2.size() << endl;//20
cout << s2 << endl; //Hello stringstring s3("Hello string");
s3.resize(20, 'x');
cout << s3.size() << endl; //20
cout << s3 << endl; //Hello stringxxxxxxxxstring s4("Hello string");
s4.resize(2);
cout << s4.size() << endl; //2
cout << s4 << endl; //He

【resize规则】:

  • 当n大于当前对象的size时 将size扩大到n 若未指定字符 默认为’\0’
  • 当n小于当前对象的size时 将size缩小到n
  1. capacity:返回总空间的大小
//size_t capacity() const; 函数接口
string s5("Hello string");
cout << s5.capacity() << endl; //15
  1. reserve: 改变对象容量的大小
//void reserve (size_t n = 0); 函数接口
string s5("Hello string");
cout << s5.capacity() << endl;//15s5.reserve(50);
cout << s5.capacity() << endl;//63s5.reserve(10);
cout << s5.capacity() << endl;//63

【reserve规则】:

  • 当n大于当前对象的capacity时 将capacity扩大到n或大于n(不同的编译器实现的不一样)
  • 当n小于当前对象的capacity时 什么也不做
  1. clear:清空有效字符
//void clear(); 函数接口
string s6("Hello string");
s6.clear();
cout << s6 << endl;//什么都不打印 已经清空了

clear()只是将string中有效字符清空,不改变底层空间大小。
8. empty: 检测字符串是否为空串 是返回true 否返回false

//bool empty() const; 函数接口
string s7("Hello string");
cout << s7.empty() << endl;//0string s8("");
cout << s8.empty() << endl; //1

string类对象的访问及遍历操作

image.png

  1. operator[]返回pos位置的字符(pos为下标)
//char& operator[] (size_t pos); 函数接口
//const char& operator[] (size_t pos) const; 函数接口 
string s9("Hello string");
cout << s9[0] << endl; //H
cout << s9[1] << endl; //e
s9[0] = 'X';
cout << s9 << endl; //Xello string
  1. at与操作符[]功能一样 区别在于一个是操作符重载 一个是成员函数
//char& at (size_t pos); 函数接口
//const char& at (size_t pos) const;  函数接口
string s10("Hello string");
cout << s10.at(0) << endl; //H
s10.at(0) = 'X'; 
cout << s10 << endl;//Xello string
  1. back和front

返回字符串的尾部和头部位置的字符

//char& back();函数接口
//const char& back() const;函数接口
//char& front();函数接口
//const char& front() const; 函数接口
string s11("Hello string");
s11.back() = '!';
s11.front() = 'X';
cout << s11 << endl;//Xello strin!

string迭代器函数遍历类对象

image.png

  1. begin和endbegin获取第一个字符的迭代器 end获取最后一个字符的下一个位置的迭代器 一般用来遍历对象
//iterator begin(); 函数接口
//const_iterator begin() const; 函数接口
//iterator end(); 函数接口
//const_iterator end() const; 函数接口
string s12("Hello string");
//返回值是一个迭代器类型 用法和指针有点类似
string::iterator  it = s12.begin();
while (it != s12.end())
{cout << *it;it++;
}//Hello string
  1. rebegin和rendrbegin获取最后一个字符的下一个位置的迭代器 rend获取第一个字符的迭代器 一般用来逆向遍历
//reverse_iterator rbegin(); 函数接口
//const_reverse_iterator rbegin() const; 函数接口
//reverse_iterator rend(); 函数接口
//const_reverse_iterator rend() const; 函数接口
string s13("Hello string");
auto rit = s13.rbegin();while (rit != s13.rend())
{cout << *rit;++rit;
}//gnirts olleH

剩下的用处很少 就不介绍了

stirng类对象的修改操作

image.png

  1. operator+= 在字符串后面追加字符串str
//string& operator+= (const string& str); 函数接口
//string& operator+= (const char* s); 函数接口
//string& operator+= (char c); 函数接口
string s14("Hello string");
string s15("!");
s14 += s15;
cout << s14 << endl; //Hello string!
s14 += "!!!";
cout << s14 << endl; //Hello string!!!!
s14 += '!';
cout << s14 << endl; //Hello string!!!!!
  1. append 在字符串后面追加字符串
//string& append (const string& str);   函数接口
//string& append (const char* s);   函数接口
//string& append (size_t n, char c); 函数接口
string s16("Hello string");
string s17("!!!");
s16.append(s17);
cout << s16 << endl;//Hello string!!!
s16.append("!!!"); 
cout << s16 << endl;//Hello string!!!!!!
s16.append(10,'x'); 
cout << s16 << endl;//Hello string!!!!!!xxxxxxxxxx
  1. push_back:在字符串后面尾插字符c
//void push_back (char c); 函数接口
string s18("Hello stirng");
s18.push_back('!');
s18.push_back('!');
s18.push_back('!');
cout << s18 << endl;// Hello stirng!!!

4.assign:分配一个新的字符串替换当前内容

//string& assign (const string& str); 函数接口
//string& assign (const char* s); 函数接口
//string& assign (size_t n, char c); 函数接口string s19("Hello");
string s20("string");
s19.assign(s20);
cout << s19 << endl;//string
s19.assign("XXXXX");
cout << s19 << endl; //XXXXX
s19.assign(10, '!');
cout << s19 << endl;//!!!!!!!!!!
  1. insert在指定的位置后面插入字符串
//string& insert (size_t pos, const string& str);  函数接口
//string& insert (size_t pos, const char* s);  函数接口
//iterator insert (iterator p, char c); 函数接口
string s21("H");
s21.insert(1, "e");//He
s21.insert(2, "llo"); //Hello
s21.insert(s21.end(), '!');//Hello!

6.erase删除指定位置的字符

//string& erase (size_t pos = 0, size_t len = npos);   函数接口
//iterator erase (iterator p);   函数接口
//iterator erase (iterator first, iterator last); 函数接口
string s22("Hello string");
s22.erase(6, 7);
cout << s22 << endl; //Hello
s22.erase(s22.begin());
cout << s22 << endl; //ello
s22.erase(s22.begin(),s22.end());
cout << s22 << endl;//空

7.replace替换字符串的一部分

//string& replace (size_t pos, size_t len, const char* s);  函数接口
//string& replace (size_t pos, size_t len, size_t n, char c); 函数接口
string s22("Hello string");
s22.replace(6, 7,"juejing");
cout << s22 << endl;//Hello juejing
s22.replace(6, 7, 8, 'x');
cout << s22 << endl;//Hello xxxxxxxx

8.swap交换两个string类对象

//void swap (string& str); 函数接口
string s23("hello");
string s24("string");
s23.swap(s24);
cout << s23 << endl; //string
cout << s24 << endl; //hello

string类非成员函数

image.png

  1. operator+:连接字符串
//string operator+ (const string& lhs, const string& rhs); 函数接口string类+string类
//string operator+ (const string& lhs, const char*   rhs);函数接口 string类+字符串
//string operator+ (const char*   lhs, const string& rhs);函数接口 字符串+string类
//string operator+ (const string& lhs, char          rhs);函数接口 string类+字符
//string operator+ (char          lhs, const string& rhs);函数接口 字符+string类
string s24("Hello ");
string s25("string");
cout << (s24 + s25) << endl;//Hello string
cout << (s24 + "string") << endl;//Hello string
cout << ("Hello " + s25) << endl;//Hello string
cout << (s24 + '!') << endl; //Hello !
cout << ('!' + s25) << endl; //!string

【建议】:尽量少用 传值返回 深拷贝 效率太低

  1. relational operator 大小比较
    函数接口:
    image.png
    用法与内置类型一样
string s24("Hello ");
string s25("string");
if (s24 > s25)
{cout << "s24 > s25" << endl;
}
else
{cout << "s24 < s25" << endl;//执行此分支
}

3.swap:交换两个string类对象
之前的swap是string类的成员函数 这个swap是非成员函数

//void swap (string& x, string& y); 函数接口
string s26("Hello string");
string s27("Hello world");
swap(s26, s27);
cout << s26 << endl;//Hello world
cout << s27 << endl;//Hello string

4.operator>> 和 operator<<:流插入和流提取操作符重载

//istream& operator>> (istream& is, string& str); 函数接口
//ostream& operator<< (ostream& os, const string& str); 函数接口
string s28;
cin >> s28;//输入
cout << s28 << endl;

5.getline获取一行字符串

//istream& getline (istream& is, string& str, char delim); 从is中提取到的字符存储到str中,直到读取到分隔符delim或换行符’\n’为止。
//istream& getline (istream& is, string& str);从is中提取到的字符存储到str中,直到读取到换行符’\n’为止。
string s29;
getline(cin,s29,'D'); //输入ABCDEF
cout << s29;//输出ABCstring s30;
getline(cin, s30);//输出Hello string
cout << s30; //输出Hello string

【注意】:使用>>进行输入时 当读取到空格时就会停止读取 所以不能使用>>将带有空格的字符串读到string类对象中 使用getline函数就可以解决这一问题

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

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

相关文章

SpringCloud01

SpringCloud01 1.认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构&#xff…

【腾学汇的第1个实验代码】应用Matplotlib绘制图标分析

应用Matplotlib绘制图标分析 # 1.创建一维数组 # 导入包 import numpy as np#两种方式创建一维数组 vector np.array([1,2,3]) #把数列转换成 nampy格式的数组 print(vector)print(type([1, 2, 3]), type(vector)) vector np.arange(15) #使用numpy.arange()方法创建给定区…

吉他效果器开发方法

吉他效果器开发方法 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)&#xff1f;可加我微信hezkz17, 本群提供音频技术答疑服务&#xff0c;群赠送语音信号处理降噪算法&#xff0c;蓝牙耳机音频&#xff0c;ADI DSP音频项目核心开发资料, 1 做出的效果图 2 介绍 …

【网络通信】探索UDP与TCP协议、IP地址和端口号的奥妙

&#x1f33a;个人主页&#xff1a;Dawn黎明开始 &#x1f380;系列专栏&#xff1a;网络奇幻之旅 ⭐每日一句&#xff1a;往前走&#xff0c;朝着光 &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️ 文章目录 &#x1f4cb;前…

【项目管理】甘特图(2)——甘特图教程

哈喽啊&#xff0c;你好&#xff0c;我是雷工。 通过上节初步认识了甘特图&#xff0c;本节学习如何一步步创建甘特图&#xff0c;以下为学习笔记。 一、样例展示 下边记录创建甘特图的操作步骤&#xff0c;完成的实际效果如下图所示&#xff1a; 实例图的上端展示项目的重要…

Altium Designer学习笔记7

PCB封装库的制作&#xff1a; 距离的测量&#xff1a; 各个焊盘的位置&#xff1a; 直插元件选择Multi-Layer。如果贴片元件的则选择顶层Top-Layer&#xff0c;或者Bottom-Layer。 形状是方形&#xff0c;尺寸是2mm*2mm。 孔的尺寸是1.4mm。 则该器件就制作完成。 TSSOP28封装…

VirtualBox7安装Ubuntu20及全屏、共享、粘贴板等设置

VirtualBox7安装Ubuntu20及全屏、共享、粘贴板等设置 1. 安装VirtualBox2. 安装Ubuntu202.1 获得x.vdi2.2 新建虚拟电脑 3. 增强设置3.1 增强功能3.2 全屏3.2 共享文件夹3.4 粘贴板 1. 安装VirtualBox 官网https://www.virtualbox.org/wiki/Downloads下载&#xff0c;笔者选择…

MyCAT2分库分表

目录 ​​​​​​一、分库分表的原理 1.垂直切分 2.水平切分 3.如何分表 1.选择要拆分的表 2.选择分表的定段 3.分库分表的环境准备 1.进入dw0配置 1&#xff09;进入目录&#xff1a; 2&#xff09;修改dw0.cnf&#xff1a; 3&#xff09;修改dr0.cnf&#xff1a;…

# 聚类系列(一)——什么是聚类?

目前在做聚类方面的科研工作, 看了很多相关的论文, 也做了一些工作, 于是想出个聚类系列记录一下, 主要包括聚类的概念和相关定义、现有常用聚类算法、聚类相似性度量指标、聚类评价指标、 聚类的应用场景以及共享一些聚类的开源代码 下面正式进入该系列的第一个部分&#xff…

做好性能测试计划的4个步骤!全都是精华!【建议收藏】

如何做好一次性能测试计划呢&#xff1f;对于性能测试新手来说&#xff0c;也许你非常熟悉Jmeter的使用&#xff0c;也许你清楚的了解每一个系统参数代表的意义&#xff0c;但是想要完成好一次性能测试任务&#xff0c;并不仅仅是简单的写脚本&#xff0c;加压力&#xff0c;再…

【Seata源码学习 】篇三 TM开启全局事务的过程

【Seata源码学习 】篇三 TM开启全局事务的过程 TM发送 单个或批量 消息 以发送GlobalBeginRequest消息为例 TM在执行拦截器链路前将向TC发送GlobalBeginRequest 消息 io.seata.tm.api.DefaultGlobalTransaction#begin(int, java.lang.String) Overridepublic String begin(…

使用iframe 发现样式错位的解决办法

原理就是默认隐藏 点击的时候&#xff08;或者需要的时候&#xff09;展示出来 方法二 宽高为0

nacos网关

目录 拉取docker镜像 环境配置 网关搭建架构 wemedia-gateway网关配置 依赖 启动类配置 网关yml配置 nacos配置中心配置网关 wdmedia服务配置 依赖 启动类配置 yml配置 nacos配置 nacos中的配置共享 nacos配置 wmedia模块中yml的配置 参考:https://blog.csdn.net/…

springBoot中starter

springBoot项目中引入starter 项目引入xxljob&#xff0c;仅需要导入对应的starter包&#xff0c;即可进行快速开发 <dependency><groupId>com.ydl</groupId><artifactId>xxl-job-spring-boot-starter</artifactId><version>0.0.1-SNAPS…

深度学习知识点

深度学习过程 data [] for i,d in enumerate(data):image,label d image,label image.cuda(),label.cuda()img net(image)optimizer.zero_grad()#需要将梯度信息清零&#xff0c;因为梯度计算是按照batch分批次计算的&#xff0c;如果这一批batch没清零&#xff0c;会影响…

P1141 01迷宫(dfs+染色联通块)

染色联通块&#xff1a; 一个格联通的所有格 每个对应的最大可联通格子的个数均相同 分析&#xff1a; 1.只需要计算每个块里的元素个数 2.元素标记对应某个块 3.查找元素时&#xff1a; 由 &#xff08;1&#xff09;元素坐标-> &#xff08;2&#xff09;查找…

庖丁解牛:NIO核心概念与机制详解 07 _ 字符集

文章目录 Pre概述编码/解码处理文本的正确方式示例程序Code Pre 庖丁解牛&#xff1a;NIO核心概念与机制详解 01 庖丁解牛&#xff1a;NIO核心概念与机制详解 02 _ 缓冲区的细节实现 庖丁解牛&#xff1a;NIO核心概念与机制详解 03 _ 缓冲区分配、包装和分片 庖丁解牛&…

验证回文串

题目链接 验证回文串 题目描述 注意点 1 < s.length < 200000s 仅由可打印的 ASCII 字符组成将所有大写字符转换为小写字符忽略所有非字母数字字符 解答思路 首先将大写字母转为小写字母&#xff0c;再双指针分别从首尾判断对应位置的字符是否相同&#xff0c;注意当…

基于springboot实现应急救援物资管理系统项目【项目源码】计算机毕业设计

基于springboot实现应急救援物资管理系统演示 JAVA简介 JavaScript是一种网络脚本语言&#xff0c;广泛运用于web应用开发&#xff0c;可以用来添加网页的格式动态效果&#xff0c;该语言不用进行预编译就直接运行&#xff0c;可以直接嵌入HTML语言中&#xff0c;写成js语言&a…

「MobileNet V3」70 个犬种的图片分类

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…