【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.mfbz.cn/a/163449.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【使用vscode在线web搭建开发环境--code-server搭建】

官方版本下载 https://github.com/coder/code-server/releases?q4.0.0&expandedtrue使用大于版本3.8.0,因为旧版本有插件市场不能访问的情况版本太高需要更新环境依赖 拉取安装包 []# wget "https://github.com/coder/code-server/releases/download/v4.0.0/code-…

64位ATT汇编语言使用bss段.skip指令储存字符,并使用系统调用输出字符

.global main .section .data .section .bss# 需要输出的字符数组&#xff0c;还没有初始化mystring: .skip 4 .section .text main:# 将mystring这个字符串的地址存入到rbx寄存器中leaq mystring,%rbx# 将a放入到mystring第一个字节里边movb $a,(%rbx)# 将地址往后边移动一个字…

16万亿Web3蓝图落地新加坡

作者&#xff1a;秦晋 11月15日&#xff0c;新加坡金管局&#xff08;MAS&#xff09;宣布与金融行业合作&#xff0c;以扩大资产代币化计划&#xff0c;并开发扩大代币化市场的基础能力。Project Guardian 由 17 家金融机构组成&#xff0c;启动五个行业试点&#xff0c;以测试…

Leetcode—3.无重复字符的最长子串【中等】

2023每日刷题&#xff08;三十二&#xff09; Leetcode—3.无重复字符的最长子串 实现代码 class Solution { public:int lengthOfLongestSubstring(string s) {unordered_set<char> smap;int maxlen 0;int left 0;for(int i 0; i < s.size(); i) {while(smap.fi…

公共字段自动填充-Mybatis Plus实现

简历描述 使用ThreadLocal动态获取当前登录用户&#xff0c;从而解决MybatisPlus公共字段自动填充问题。达到简化编码的目的&#xff0c;使业务方法更加简洁。 问题分析 前面我们已经完成了后台系统的员工管理功能的开发&#xff0c;在新增员工时需要设置创建时间、创建人、…

Zabbix5.0部署及应用

环境 主机名 IP 类型server01192.168.134.165zabbix-serverserver02 192.168.134.166zabbix-agent 官方部署文档 1 .安装yum源 [rootserver01 ~]# rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-rel…

浅谈WPF之控件模板和数据模板

WPF不仅支持传统的Windows Forms编程的用户界面和用户体验设计&#xff0c;同时还推出了以模板为核心的新一代设计理念。在WPF中&#xff0c;通过引入模板&#xff0c;将数据和算法的“内容”和“形式”进行解耦。模板主要分为两大类&#xff1a;数据模板【Data Template】和控…

初刷leetcode题目(2)——数据结构与算法

&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️…

PostgreSQL 难搞的事系列 --- vacuum 的由来与PG16的命令的改进 (1)

开头还是介绍一下群&#xff0c;如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友…

从零开始:抖音酒店景区小程序开发指南

为了满足用户多样化的需求&#xff0c;开发一款抖音酒店景区小程序成为了业界的一个新兴趋势。在这篇文章中&#xff0c;我们将探讨如何开发一款引人注目的抖音风格的酒店景区小程序。 一、抖音风格的设计理念 在设计酒店景区小程序时&#xff0c;我们需要融入抖音的设计理念。…

22 - 如何优化垃圾回收机制?

我们知道&#xff0c;在 Java 开发中&#xff0c;开发人员是无需过度关注对象的回收与释放的&#xff0c;JVM 的垃圾回收机制可以减轻不少工作量。但完全交由 JVM 回收对象&#xff0c;也会增加回收性能的不确定性。在一些特殊的业务场景下&#xff0c;不合适的垃圾回收算法以及…

Leetcode—剑指OfferII LCR 022.环形链表II【中等】

2023每日刷题&#xff08;三十三&#xff09; Leetcode—LCR 022.环形链表II 算法思想 参考k神的博客 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode *detectCycle(struct List…

【C++】类和对象(6)--运算符重载

目录 一 概念 二 运算符重载的实现 三 关于时间的所有运算符重载 四 默认赋值运算符 五 const取地址操作符重载 一 概念 C为了增强代码的可读性引入了运算符重载&#xff0c;运算符重载是具有特殊函数名的函数&#xff0c;也具有其返回值类型&#xff0c;函数名字以及参数…

Git 简介及使用

前言 假设有这样一个场景&#xff0c;老板让员工做一个档案&#xff0c;员工这个档案做好了之后交给老板看&#xff0c;此时老板不满意&#xff0c;又让回去改&#xff0c;改完给老板看&#xff0c;但是老板又不是很满意&#xff0c;就这样改了又改&#xff0c;给老板看过之后&…

代码随想录算法训练营第四十五天| 139.单词拆分

文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;代码随想录B站账号 状态&#xff1a;看了视频题解和文章解析后做出来了 139.单词拆分 class Solution:def wordBreak(self, s: str, wordDict: List[str]) -> bool:n len(s)dp [False] * (n1)dp[0] Truemax_len m…

WMS重力式货架库位对应方法

鉴于重力式货架的特殊结构和功能&#xff0c;货物由高的一端存入&#xff0c;滑至低端&#xff0c;从低端取出。所以重力式货架的每个货位在物理上都会有一个进货口和一个出货口。因此&#xff0c;在空间上&#xff0c;对同一个货位执行出入库操作需要处于不同的位置。 比如对…

【AD封装】芯片IC-SOP,SOIC,SSOP,TSSOP,SOT(带3D)

包含了我们平时常用的芯片IC封装&#xff0c;包含SOP,SOIC,SSOP,TSSOP,SOT&#xff0c;总共171种封装及精美3D模型。完全能满足日常设计使用。每个封装都搭配了精美的3D模型哦。 ❖ TSSOP和SSOP 均为SOP衍生出来的封装。TSSOP的中文解释为&#xff1a;薄的缩小型 SOP封装。SSO…

GSVA,GSEA,KEGG,GO学习

目录 GSVA 1&#xff1a;获取注释基因集 2&#xff1a;运行 GSEA 1,示例数据集 2,运行 GSEA_KEGG富集分析 GSEA_GO富集分析 DO数据库GSEA MSigDB数据库选取GSEA KEGG 1&#xff1a;运行 2&#xff1a;绘图 bar图 气泡图 绘图美化 GO GSVA 1&#xff1a;获取注…

springBoot 配置druid多数据源 MySQL+SQLSERVER

1:pom 文件引入数据 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.0</version> </dependency>…

mysql服务器数据同步

在Linux和Windows之间实现MySQL服务器数据的同步。下面是一些常见的方法和工具&#xff1a; 复制&#xff08;Replication&#xff09;&#xff1a;MySQL复制是一种常见的数据同步技术&#xff0c;可用于将一个MySQL服务器的数据复制到其他服务器。您可以设置主服务器&#xff…
最新文章