【C++】容器string的常用成员函数接口

目录

string - C++ Reference

1 容量相关

1.1 size/length

1.2 capacity

1.3 resize

1.4 reserve

1.5 empty

2 运算符重载

2.1 operator=

2.2 operator[]

2.3 operator+(非成员函数)

2.4 operator+=

2.5 operator>> && operator<<(非成员函数)

3 增删查改的接口

3.1 push_back

3.2 append

3.3 insert 

3.4 erase

3.5 assign

3.6 find


string - C++ Reference

1 容量相关

1.1 size/length

size和length表示string里存储的有效数据的大小/长度。 

可以用来for循环遍历string:

string str("hello string");
for(int i = 0;i < str.size();++i)
{cout<<str[i];//[]重载
}
string str("hello string");
for(int i = 0;i < str.length();++i)
{cout<<str[i];//[]重载
}

注:

length用来表示线性数据结构的有效数据长度大小,size既可以用来表示线性数据结构的有效数据大小、也可以用来表示非线性结构的有效数据大小,可以说size是通用的


1.2 capacity

capacity表示已经分配的空间的大小,通常capacity>=size/length


1.3 resize

顾名思义,改变string对象的size,有两个函数重载

体现为两个方面:

①如果传入的n<原先的长度,仅仅会删除数据,不作数据修改,因此有效重载函数形式为

void resize(size_t n)

 vs编译器:

g++:

②如果传入的n>原先的长度,不仅会改变容量,而且可以指定增加的数据,因此有效函数重载形式为:

void resize (size_t n)
void resize (size_t n, char c)

 vs编译器:

指定增加的字符为'x':

不指定增加的字符,可能放入的都是\0: 

 g++:

 不指定增加的字符,可能放入的都是\0:


1.4 reserve

顾名思义,reserve会改变capacity,而不会改变数据,因此传入的参数n大于原先的capacity才有效果!

vs编译器:

g++:


1.5 empty

 函数返回类型为真或者假


2 运算符重载

2.1 operator=


我们原本以为的赋值运算符重载:

第二行还有报错,报错信息是:

实际上这并不是赋值运算符重载,实际的运算符重载应该是这样的:

vs下=号的颜色都变了,说明两次=的作用是不一样的。为什么呢?

这下我们明白了,之所以第二次是赋值运算符重载,是因为s1、s2、s3都已经初始化好了,而且都是调用的默认构造函数string() 。

赋值运算符的运算顺序是自右向左的,s1先赋值给s2,s2再赋值给s3。 


2.2 operator[]

operator[]为我们提供了通过下标直接访问字符串内容的便利,有两种函数重载,一种给普通对象,另一种给const对象。


2.3 operator+(非成员函数)

Concatenate strings:连接字符或字符串 

用法:

为什么这个重载是非成员函数呢?

        我们都知道成员函数的第一个参数是隐藏的this指针,指向实例化出来的对象, 因此如果把+重载写在类里面也就是成员函数,第一个参数就必然是实例化出来的对象,而相加的两个对象不必一定要有this,可以是其他的两个对象,所以STL库就把它设计成非成员函数。


2.4 operator+=

官网里的例子:

和赋值重载一样,需要先进行初始化调用构造函数才能进行+=重载!

operator+=可以很方便地进行字符串尾插的操作,相当于尾插,尾插前先检查容量,容量不够先扩容再尾插。下面还有append、insert等的接口函数,也是用来进行字符串增加的。


2.5 operator>> && operator<<(非成员函数)

为了方便输入和直接输出string里的内容,设计出了流插入和流提取的重载。

这两个必须设计成非成员函数否则就会导致cout和str的顺序颠倒:str<<cout

因为左右操作数和函数的传参类型要一致,成员函数的第一个参数永远是this指针!


3 增删查改的接口

3.1 push_back

尾插会先检查容量,容量不够先扩容,然后在进行尾插操作。尾插结束后再补一个\0,模拟一下:

void push_back(char c)
{if (_capacity == _size){reserve(_capacity == 0 ? 4 : _capacity * 2);}_str[_size] = c;_size++;_str[_size] = '\0';
}


3.2 append

append提供了六种函数重载,可以看作push_back的plus版本。

string s = "hello";
string _s = " string";
s.append(_s);//hello string
s.append(_s,0,3);//hello st
s.append(" string");//hello string
s.append(" string", 2);//hello s
s.append(5,'x');//helloxxxxx
s.append(_s.begin(),_s.begin()+2);//hello s

讲解一下第二种和第四种:

substring(2):

string& append (const string& str, size_t subpos, size_t sublen)
string s = "hello";
string _s = " string";
s.append(_s,0,3);//hello st

功能:将副串_s的一部分尾插至主串s之后。

注:

subpos必须小于等于sublen,否则就会: 

如果sublen大于strlen(_s),编译器会多开空间吗? 

vs编译器:

g++:

答案是不会!

buffer(4):

string& append (const char* s, size_t n)
string s = "hello";
s.append(" string", 3);
cout<<s;//hello st

功能:将常量字符串的一部分尾插至s。

注:

如果传入的参数n大于strlen(s),编译器会多开空间吗?

vs编译器:

g++:

答案是会的! 


3.3 insert 

由于顺序表头插的时间复杂度为O(n),效率较低,所以STL库并没有实现string的头插接口,而是设计了一个insert,可以用来在pos位置插入字符或字符串,特殊的当pos为0时,就相当于头插。

其中前四种的设计和上面append的设计类似,后三种多了迭代器的传参:

void insert(iterator p,size_t n,char c);
iterator insert (iterator p, char c);
template <class InputIterator>void insert (iterator p, InputIterator first, InputIterator last);

第一种的用法:

第二种用法:

第三种用法:


3.4 erase

顾名思义,删除字符串中的字符。

用法:

第一种:


缺省参数pos=0,len=(size_t)(-1)=2^32-1

第二种:

传入迭代器,删除迭代器指向的单个字符,并返回迭代器。

顺序是先删除h再把删除后的s.begin()赋值给it。

第三种:

范围删除并返回迭代器,范围是[first,last),左闭右开!


3.5 assign

assign的用法其实就是新串代替旧串,举一个例子就行:


3.6 find

find还是挺好用的,至少不用自己写字符串查找算法,找到了就返回找到的最开始的位置,找不到就返回(size_t)(-1)。

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

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

相关文章

数学建模 | 灰色预测原理及python实现

目录 一、灰色预测的原理 二、灰色预测的应用及python实现 一、灰色预测的原理 灰色预测是以灰色模型为基础&#xff0c;灰色模型GM(n,h)是微分方程模型&#xff0c;可用于描述对象做长期、连续、动态的反应。其中&#xff0c;n代表微分方程式的阶数&#xff0c;h代表微分方…

FISCOBCOS入门(十)Truffle测试helloworld智能合约

本文带你从零开始搭建truffle以及编写迁移脚本和测试文件,并对测试文件的代码进行解释,让你更深入的理解truffle测试智能合约的原理,制作不易,望一键三连 在windos终端内安装truffle npm install -g truffle 安装truffle时可能出现网络报错,多试几次即可 truffle --vers…

Ant Design for Figma设计系统组件库 支持变量 非社区版

Ant Design for Figma 是基于 Ant Design 设计系统的 Figma 组件库&#xff0c;提供丰富的 UI 组件和交互功能&#xff0c;帮助设计师快速构建高质量的 Figma 设计稿。 Ant Design for Figma 继承了 Ant Design 的设计理念和风格&#xff0c;提供丰富的 UI 组件和交互功能&…

AI机器学习 | 基于librosa库和使用scikit-learn库中的分类器进行语音识别

专栏集锦&#xff0c;大佬们可以收藏以备不时之需 Spring Cloud实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏&#xff1a;https:/…

若依框架的介绍与基本使用(一起走进若依框架的世界)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《若依框架开发》。&#x1f3af;&#x1f3af; &…

【技术追踪】SAM(Segment Anything Model)代码解析与结构绘制之Mask Decoder

论文&#xff1a;Segment Anything   代码&#xff1a;https://github.com/facebookresearch/segment-anything 系列篇&#xff1a;   &#xff08;1&#xff09;【技术追踪】SAM&#xff08;Segment Anything Model&#xff09;代码解析与结构绘制之Image Encoder   &am…

谷歌投资Character.AI,展现AI领域的战略布局和创新能力

谷歌&#xff08;Google&#xff09;作为全球最大的互联网公司之一&#xff0c;一直在人工智能&#xff08;AI&#xff09;领域发挥着引领和推动的作用。近日&#xff0c;据消息人士透露&#xff0c;谷歌正与人工智能初创公司 Character.AI 进行投资谈判&#xff0c;计划投资数…

腾讯云服务器新用户优惠有哪些?腾讯云服务器新人优惠整理汇总

你们是否曾经幻想过拥有一台属于自己的服务器&#xff0c;却因为价格而望而却步呢&#xff1f;今天&#xff0c;我要告诉你一个好消息——腾讯云服务器现在针对新用户推出了一系列的优惠政策&#xff0c;让你可以用超低的价格购买到性能强大的服务器&#xff01; 首先&#xf…

基于深度学习的单帧图像超分辨率重建综述

论文标题&#xff1a;基于深度学习的单帧图像超分辨率重建综述作者&#xff1a; 吴 靖&#xff0c;叶晓晶&#xff0c;黄 峰&#xff0c;陈丽琼&#xff0c;王志锋&#xff0c;刘文犀发表日期&#xff1a;2022 年9 月阅读日期 &#xff1a;2023.11.18研究背景&#xff1a; 图像…

如何在el-tree懒加载并且包含下级的情况下进行数据回显-01

在项目中做需求&#xff0c;遇到一个比较棘手的问题&#xff0c;el-tree懒加载在包含下级的时候&#xff0c;需要做回显&#xff0c;将选中的数据再次勾选上&#xff0c;在处理这个需求的时候有两点是比较困难的&#xff1a; el-tree是懒加载的&#xff0c;包含下级需要一层一…

腾讯云服务器怎么买便宜?腾讯云服务器新人专享限时特惠购买链接

腾讯云作为国内领先的云计算服务提供商之一&#xff0c;为个人用户和企业用户提供了多种优惠活动。这些活动不仅能帮助用户节省成本&#xff0c;还能提升企业的效益。本文将介绍腾讯云的多重优惠活动&#xff0c;让用户能够以更优惠的价格购买和续费云服务器。 腾讯云双十一领…