C++ sting类(一)各类操作

news2024/12/23 14:04:09

1、 C语言中的字符串

C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,

但是这些库函数与字符串是分离开的,不太符合程序设计的思想,而且底层空间需要用户自己管理,稍不留神可

能还会越界访问

2. 标准库中的string类

注意:本文是在VS2019下操作学习,不同环境下一些结论可能不成立

2.1 string类

几个注意点:

1. string是表示字符串的字符串类

2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作

3. string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>

string;

4. 不能操作多字节或者变长字符的序列。

使用string类时,必须包含#include头文件以及using namespace std;

注意没有 .h 为 include<string>

2.2 string类的常用接口说明

1. string类对象的常见构造

(constructor)函数名称

功能

string() (重点)

构造空的string类对象,即空字符串

string(const char* s) (重点)

用C-string来构造string类对象

string(size_t n, char c)

string类对象中包含n个字符c

string(const string&s) (重点)

拷贝构造函数

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

int main()
{
    string s1;

    string s2("hello");

    string s3(s2);//拷贝构造

    string s4(10, 'A');
        //十个A

    cout << s2 << endl;
    cout << s2 << endl;
    cout << s4 << endl;

    return 0;
}

2. string类对象的容量操作

函数名称

功能说明

size(重点)

返回字符串有效字符长度

length

返回字符串有效字符长度

capacity

返回空间总大小

empty (重点)

检测字符串释放为空串,是返回true,否则返回false

clear (重点)

清空有效字符

reserve (重点)

为字符串预留空间**

resize (重点)

将有效字符的个数该成n个,多出的空间用字符c填充

代码举例:

size\length\capacity\empty

void TestString2()
{
    string s("hello");
    cout << s.size() << endl;
    cout << s.length() << endl;
    cout << s.capacity() << endl;

    if (!s.empty())
    {
        cout << "s is not empty():"<<s << endl;
    }
    else
    {
        cout << "s is empty()"<<endl;
    }
    
    //将s中有效字符清空
    s.clear();
    cout << s.size() << endl;
}
int main()
{
    TestString2();

    return 0;
}

reserve

void TestString3()
{
    string s("hello");
    cout << s.size() << endl;
    cout << s.capacity() << endl;

    s.reserve(20);
    cout << s.size() << endl;
    cout << s.capacity() << endl;

    s.reserve(100);
    cout << s.size() << endl;
    cout << s.capacity() << endl;

    s.reserve(80);
    cout << s.size() << endl;
    cout << s.capacity() << endl;

    s.reserve(15);
    cout << s.size() << endl;
    cout << s.capacity() << endl;
}

通过reserve将string底层空间扩大,假设string底层旧空间大小为oldcapacity

如果newcapacity大于oldcapacity,空间确实会变大。

string类内部会按照一定机制跟进用户所传递的容量去计算新的容量

扩容机制:开辟新空间,拷贝元素,释放旧空间

但是:如果new<old && new>=16时,reserve会忽略本次操作,不会扩容缩小

new<16:reserve会将底层空间大小缩为15

问题:为什么new<16时,reserve才会真正将空间缩小?

因为在string对象内部包含了一个固定大小数组--》char buff[16]

原因:绝大多数情况下的字符串中的有效字符个数都是小于16 如人名等

直接使用固定大小的数组,不从堆上开辟空间可以让string类效率更高,

当有效元素超过16时,string类才真正从堆上开辟空间,从堆上开辟空间是有时间消耗,所以string类从堆上申请成功之后一般不会将空间缩小

resize

resize(size_t newsize, char ch='\0'):将有效元素个数修改到newsize,如果newsize大于string对象中原有的字符个数多出的字符就用ch填充

void TestString3()
{
    string s("hello");
    s.resize(10, 'A');
    cout << s.size() << endl;
    cout << s.capacity() << endl;

    s.resize(20, 'B');
    s.resize(40, 'C');
    cout << s.size() << endl;
    cout << s.capacity() << endl;

    s.resize(20);
    cout << s.size() << endl;
    cout << s.capacity() << endl;

    s.resize(17);
    s.resize(16);
    cout << s.size() << endl;
    cout << s.capacity() << endl;

    s.resize(15);
    s.resize(5);
    cout << s.size() << endl;
    cout << s.capacity() << endl;
}

当newsize小于string对象中有效元素个数时,将有效元素个数缩小到newsize个,缩小时不会改变容量

其他注意:

1. size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一

致,一般情况下基本都是用size()。

2. clear()只是将string中有效字符清空,不改变底层空间大小。

3. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字

符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的

元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大

小,如果是将元素个数减少,底层空间总大小不变。

4. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于

string的底层空间总大小时,reserver不会改变容量大小

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

operator[]

越界检测操作

at也是访问任意位置元素的,处理越界方式不一样

begin+ end

begin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器

4. string类对象的修改操作

push_back (char ch):往string尾部插入ch

append 和operator+= :在string中拼接单个字符,C格式的字符串,string对象

void TestString3()
{
    string s("hello");
    s.push_back(' ');//等价于s.append(1,' ');

    //拼接C格式字符串
    s += "world";//等价于 s.append("world");

    //拼接string对象
    string ss("zx");
    s += ss;//等价于 s.append(ss);

    s += 'A';
    cout << s << endl;
}

注意:

1. 在string尾部追加字符时,s.push_back(c) / s.append(1, c) / s += 'c'三种的实现方式差不多,一般

情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。

2. 对string操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留好。

insert

void TestString3()
{
    string s("hello");

    //在0号位置插入3个A
    s.insert(0, 3, 'A');
    cout << s << endl;

    s.insert(1, "bite");
    cout << s << endl;
}

erase删除

void TestString3()
{
    string s("hello world");
    //0号位置删6个
    s.erase(0, 6);
    cout << s << endl;

    //begin此时在w位置,+2在r位置,删掉
    s.erase(s.begin() + 2);
    cout << s << endl;

    s.erase(s.begin(), s.end());//等价于全部删除了
    cout << s << endl;
}

此处所能用的各种功能函数还有很多,不再一一举例,使用时搜索即可。

一些操作

void TestString3()
{
    string s("12435234");
    cout << s << endl;

    //逆置s
    reverse(s.begin(), s.end());
    cout << s << endl;

    //排序
    sort(s.begin(), s.end());
    cout << s << endl;
}

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

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

相关文章

NEXUS 6P刷机安装Edxposed

刷机 abd等工具下载&#xff1a; https://developer.android.com/studio/releases/platform-tools?hlzh-cn 下载后配置环境变量 镜像下载&#xff1a; https://developers.google.com/android/images?hlzh-cn#angler Magisk下载 GitHub - topjohnwu/Magisk: The Magic M…

基于BP神经网络的衣服识别,BP神经网络详细原理,BP神经网络图像识别神经网络案例之19

目标 背影 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数&#xff0c; BP神经网络的传递函数 数据 神经网络参数 基于BP神经网络 性别识别的MATLAB代码 效果图 结果分析 展望 背影 人靠衣服马靠鞍&#xff0c;通过穿衣可…

Matlab字符串相关操作-拼接、格式化

常见的有三种方法&#xff1a;向量拼接、strcat函数和sprintf函数1、向量拼接在matlab中字符串本质上也是一个向量&#xff0c;可以通过矩阵运算来实现字符串的拼接&#xff0c;这里随便输入两个字符串a1和b1&#xff0c;用矩阵形式进行拼接&#xff1a;a1 I love;b1 Matlab…

Web项目部署环境搭建:JDK + Tomcat + IDEA

Web项目部署环境搭建&#xff1a;JDK Tomcat IDEA1.java JDK1.1 下载安装1.2 配置环境变量1.3 检查安装成功2. TomCat2.1 下载安装2.2 配置环境变量2.3 检查安装成功3.IDEA3.1 下载安装3.2 永久可得3.3 IDEA部署Tomcat出来混总是要还的&#xff0c;记得大学本科四年&#xff…

Protobuf 逆向解析两种方法

Protobuf 逆向解析两种方法一、Protobuf 的特征二、解析.bin文件显示原始数据法一&#xff1a;用 blackboxprotobuf 模块解析法二&#xff1a;使用 protoc 解析工具一、Protobuf 的特征 案例网址 Protocol buffers是一种语言无关、平台无关、可扩展的序列化结构数据的方法&…

计算机网络 — UDP协议(看这一篇就可以

UDP协议UDP是传输层的重要协议之一&#xff0c;另一重要协议为TCP协议。两者对比&#xff1a;TCP协议复杂&#xff0c;但传输可靠。UDP协议简单&#xff0c;但传输不可靠。UDP协议全称为&#xff1a;User Datagram Protocol&#xff08;用户数据报协议&#xff09;。它是一个简…

嵌入式 STM32 使用C语言打开读取歌曲目录

目录 一、C语言目录库函数 1、打开一个目录文件opendir() 2、readdir&#xff08;);读取目录下文件 3、建立链表保存读到的文件名 一、C语言目录库函数 目录库函数链接&#xff1a;http://wjhsh.net/qiny1012-p-8405394.html 1、打开一个目录文件opendir() opendir()函数…

JavaScript BOM操作

目录 前言 window 对象 location 对象 navigator 对象 screen 对象 history 对象 前言 BOM&#xff08;Browser Object Model&#xff09;指的是浏览器对象模型&#xff0c;它是 JavaScript 和浏览器之间的接口。通过 BOM&#xff0c;JavaScript 可以与浏览器窗口交互&…

【Linux】重定向原理dup2缓冲区

文章目录重定向原理输出重定向关于FILE解释输出重定向原理追加重定向输入重定向dup2缓冲区语言级别的缓冲区内核缓冲区重定向原理 重定向的本质就是修改文件描述符下标对应的struct file*的内容 输出重定向 输出重定向就是把本来应该输出到显示器的数据重定向输出到另一个文…

自己制作投票链接网上投票链接制作可以投票的链接制作

近些年来&#xff0c;第三方的微信投票制作平台如雨后春笋般络绎不绝。随着手机的互联网的发展及微信开放平台各项基于手机能力的开放&#xff0c;更多人选择微信投票小程序平台&#xff0c;因为它有非常大的优势。1.它比起微信公众号自带的投票系统、传统的H5投票系统有可以图…

RK3568平台开发系列讲解(设备驱动篇)Pinctrl子系统详解

🚀返回专栏总目录 文章目录 一、pinctrl子系统结构描述二、重要的概念三、主要的数据结构和接口沉淀、分享、成长,让自己和他人都能有所收获!😄 📢我们知道在许多soc内部包含有多个pin控制器,通过pin控制器的寄存器,我们可以配置一个或者一组引脚的功能和特性。Linux…

K8S篇之pod及生命周期

文章目录Pod 概览pod使用方式Pod 中如何管理多个容器Pod 和控制器Pod 模板Pod 更新与替换静态 Pod容器探针pod的生命周期Pod 阶段容器状态容器重启策略Pod 状况pod readinessGates容器探针检查机制execgrpchttpGettcpSocket探测结果探测类型livenessProbe&#xff08;存活探针&…

【JDK8新特性之Lambda表达式-案例实操】

一.JDK8新特性之Lambda表达式-案例实操 之前我们学习了Stream流相关的内容&#xff0c;如果想看的同学可以看一下之前的文章&#xff0c;接下来我们就来学习和Lambda表达式有关的内容。 二.Lambda表达式案例实操 2.1 最原始创建线程案例版本 创建一个新的线程&#xff0c;指定…

[docker]Sealer简介

文章目录安装创建集群清理集群本机免密登录镜像构建与运行KubefileSealer ImageClusterfilesealer是阿里开源的一款分布式应用打包交付运行的解决方案&#xff1b;通过把分布式应用及其所依赖的数据库、中间件等一起打包成一个集群镜像&#xff0c;解决复杂应用的交付问题。安装…

阿里云服务器部署SpringBoot+Vue项目(宝塔面板傻瓜式操作)

准备工作 一台服务器(我用的是阿里云)SpringBoot项目的jar包Vue项目的dist包 一、购买服务器 然后重置实例密码。 远程连接 登陆成功后安装宝塔面板 二、安装宝塔面板(无账号的注册一个账号) 地址&#xff1a;https://www.bt.cn/new/download.html 选择对应的镜像、不知道…

简易项目:servlet实现个人博客(超级详细)

成品展示博客登录页2.博客预览页博客详情页4.博客编写发布页5.可访问网址http://43.143.248.172:8080/blog_system/login.html用户名:zhangsan密码:123确认需求1.1核心功能1.1.1用户登陆和注销这一部分需要满足用户的登入和注销操作&#xff0c;同时需要判断用户名和密码的正确…

【ArcGIS Pro二次开发】(8):图层(Layer)的基本操作

在ArcGIS中&#xff0c;图层(Layer)是地理数据的集合。可以在 ArcGIS Pro中将很多不同类型的数据表示为图层。 图层通常包含矢量&#xff08;要素&#xff09;或栅格数据。 图层的类型取决于您拥有的数据类型、其基础结构以及其他一些变量。 一、图层(Layer)的基本操作示例 以…

华为OD机试题,用 Java 解【矩阵最大值】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…

python-在macOS上安装python库 xlwings失败的解决方式

问题&#xff1a;python库 xlwings安装失败 今天&#xff0c;看到网上有wlwings库&#xff0c;可以用来处理excel表格&#xff0c;立刻想试一试。结果&#xff0c;安装这个python库失败了。经过排查&#xff0c;问题解决。 安装过程和错误提示&#xff1a; 我用最简单直接的…

【linux】进程间通信——system V

system V一、system V介绍二 、共享内存2.1 共享内存的原理2.2 共享内存接口2.2.1 创建共享内存shmget2.2.2 查看IPC资源2.2.3 共享内存的控制shmctl2.2.4 共享内存的关联shmat2.2.5 共享内存的去关联shmdt2.3 进程间通信2.4 共享内存的特性2.5 共享内存的大小三、消息队列3.1 …