C++—string类接口与用法大总结(其中涉及STL基础)

目录

1.string类的本质

2.string类的构造

1.普通构造

2.功能型构造

1.拷贝构造功能型

2.带参构造功能型

3.其余构造

3.operator[]

4.迭代器(iterator)

1.概念

2.改变string对象本身

3.正向迭代器(iterator)

4.反向迭代器(reverse_iterator)

5.const迭代器

1.const正向迭代器(const_iterator)

2.const反向迭代器(const_reverse_iterator)

5.范围for(遍历与修改)

0.auto

1.概念

2.不改变string对象本身

3.改变string对象本身

6.容量系列

1.size:求有效数据个数(不算'\0')

2.capacity:求顺序表容量

3.reserve:用于扩容和缩容

1.扩容:

2.缩容:

7.增删系列

1.push_back:尾插一个字符

2.append:尾插一个字符串

3.operator+=:拼接字符或字符串

4.insert:在指定下标插入字符串或字符

1.插入字符串:

2.插入字符:

5.erase:从指定下标开始删除k个字符

8.replace:替换

9.find:查找(找到指定内容并返回其第一次出现的下标)

10.swap:交换函数

11.c_str:返回string类的指针成员变量(本质是为了兼容C语言)

12.substr:从某个下标开始的k个字符构造成一个新的string对象并返回

13.find_first_of:从s1中找是否存在我传过去的字符串中的任意一个字符,如果比对成功则返回下标

14.operator+

15.getline:默认遇到\n才会停止在缓冲区中取数据(cin默认遇到空格和\n就会停止在缓冲区中取数据)


1.string类的本质

string类是由字符组成的顺序表。

2.string类的构造

1.普通构造

#include <iostream>
#include <string>
using namespace std;
int main()
{//默认构造string s1;//带参构造string s2("111111");//拷贝构造string s3(s2);cout << s1 << endl;cout << s2 << endl;cout << s3 << endl;
}

结果:

2.功能型构造

1.拷贝构造功能型

string s1("hello world");//拷贝构造功能型//从下标为6的字符开始拷贝5个字符
string s2(s1, 6, 5);
//如果第三个参数超出了字符串的范围,就是从下标为6开始、打印完就结束
string s3(s1, 6, 50);
//省略第三个参数的话,就是从下标为6开始、打印完就结束
string s4(s1, 6);cout << s1 << endl;
cout << s2 << endl;
cout << s3 << endl;
cout << s4 << endl;

结果:

2.带参构造功能型

//拿字符串前5个字符构造
string s1("hello world",5);
cout << s1 << endl;

结果:

3.其余构造

//拿10个X组成字符串构造
string s1(10, 'X');
cout << s1 << endl;

结果:

3.operator[]

string类中重载了[]运算符,使其能够像数组一样使用。

class string
{
public:char& operator[](int x){return arr[x];}private:char* arr;int size;int capacity;
};

用引用返回是为了能够改变指定下标的值。

string s1("hello world");
s1[0] = 'X';
cout << s1 << endl;

结果:

4.迭代器(iterator)

1.概念

s1.begin()指向第一个元素,s1.end()指向最后一个元素的下一个元素。(最后一个元素指的是最后一个有效元素)

string s1("hello");
string::iterator it = s1.begin();
while (it != s1.end())
{cout << (*it)<<"  ";it++;
}
cout << endl;

注意:这里的it可以当指针理解,但本质不一定是指针。

结果:

2.改变string对象本身

string s1("hello");
string::iterator it = s1.begin();
while (it != s1.end())
{//这里会改变s1的每个变量*it += 2;it++;
}
cout << s1 << endl;

结果:

3.正向迭代器(iterator)

s1.begin()指向第一个元素,s1.end()指向最后一个元素的下一个元素。(最后一个元素指的是最后一个有效元素)

string s1("hello");
string::iterator it = s1.begin();
while (it != s1.end())
{cout << (*it)<<"  ";it++;
}
cout << endl;

结果:

4.反向迭代器(reverse_iterator)

rbegin指向最后一个元素,rend指向第一个元素的前一个元素。

string s1("hello");
string::reverse_iterator rit = s1.rbegin();
while (rit != s1.rend())
{cout << *rit << "  ";rit++;
}

结果:

5.const迭代器

1.const正向迭代器(const_iterator)

const string s3("hello world");
string::const_iterator cit = s3.begin();
while (cit != s3.end())
{//不能*cit += 2;cout << *cit << " ";++cit;
}
cout << endl;

2.const反向迭代器(const_reverse_iterator)

const string s3("hello world");
string::const_reverse_iterator rcit = s3.rbegin();
while (rcit != s3.rend())
{// 不能*rcit += 2;cout << *rcit << " ";++rcit;
}
cout << endl;

5.范围for(遍历与修改)

范围for适用于容器和数组

0.auto

auto是用来自动推导类型的。

string s1("hello");
//string::iterator it = s1.begin();//这里的迭代器也可以这么写:
auto it = s1.begin();
//这样写编译器会自动推导出auto此时的位置应该是一个迭代器类型

auto存在的目的是为了简化代码,但弊端就是降低了代码的可读性。

1.概念

string s2("hello");
//范围for底层是一个迭代器
//这里的x相当于拷贝的*it
for (auto x : s2)
{cout << x << "  ";
}

结果:

2.不改变string对象本身

string s2("hello");
//范围for底层是一个迭代器
//这里的x相当于拷贝的*it
for (auto x : s2)
{//这里不会改变s2字符串本身,因为x变量只是拷贝x += 2;cout << x << "  ";
}cout << endl << s2 << endl;

结果:

3.改变string对象本身

string s2("hello");
//范围for底层是一个迭代器
//这里的x相当于*it的别名
for (auto& x : s2)
{//这里会改变s2字符串本身,因为x变量是引用的s2中的每一个变量x += 2;cout << x << "  ";
}cout << endl << s2 << endl;

结果:

6.容量系列

1.size:求有效数据个数(不算'\0')

string s1("hello");
cout << s1.size() << endl;

结果:

2.capacity:求顺序表容量

string s1("hello");
cout << s1.capacity() << endl;

结果:

3.reserve:用于扩容和缩容

1.扩容:

s1.reserve(100);

假如上述语句是在扩容,那么容量会变成比100要大或者等于100的数。

2.缩容:

s1.reserve(2);

假如上述语句是在缩容,那么容量会不会变小不好说,取决于编译器,但是最起码能够保证的是,它绝对不会因为缩容而影响你原来的数据。

7.增删系列

1.push_back:尾插一个字符

string s1("hello");
s1.push_back('o');
cout << s1 << endl;

结果:

2.append:尾插一个字符串

这里的众多接口与前面讲到的构造类似,所以不再过多赘述。

string s1("hello");
s1.append("xxx");
cout << s1 << endl;

结果:

3.operator+=:拼接字符或字符串

string s1("hello");
s1 += ' ';
s1 += "world";
cout << s1 << endl;

结果:

4.insert:在指定下标插入字符串或字符

1.插入字符串:

string s1("hello");
//在下标为1的位置插入xxx
s1.insert(1, "xxx");
cout << s1 << endl;

结果:

2.插入字符:

string s1("hello");
char ch = 'x';
//在下标为0的位置插入2个ch字符
s1.insert(0, 2, ch);
cout << s1 << endl;

结果:

这里的第二个参数不能省略从而变成插入1个字符,可见C++中的string类的设计是有一些冗余的。

5.erase:从指定下标开始删除k个字符

string s1("hello world");
//从指定下标0开始删除1个数据
s1.erase(0, 1);
cout << s1 << endl;

结果:

string s1("hello world");
//若省略第二个参数,则从指定下标6开始删除直到结束
s1.erase(6);
cout << s1 << endl;

结果:

8.replace:替换

string s1("hello world");
//将下标为5起始的4个元素替换
s1.replace(5, 4, "xxx");
cout << s1 << endl;

结果:

9.find:查找(找到指定内容并返回其第一次出现的下标)

string s1("hello world");//返回找到的下标,如果没找到,则返回npos
int pos = s1.find("hello");
cout << pos << endl;

结果:

string s1("hello world  hello  hello ");//返回找到的下标(从3下标开始找),如果没找到,则返回npos
int pos = s1.find("hello",3);
cout << pos << endl;

结果:

10.swap:交换函数

swap函数用来交换两个对象的所有成员变量。

string s1("hello xxx");
string s2("hello yyy");
s1.swap(s2);
cout << s1 << endl;
cout << s2 << endl;

结果:

11.c_str:返回string类的指针成员变量(本质是为了兼容C语言)

class string
{
public:private:char* arr;int size;int capacity;
};
string s1("hello xxx");
string s2("hello yyy");
const char* str1 = s1.c_str();

这里的s1.c_str()返回的就是s1.arr

12.substr:从某个下标开始的k个字符构造成一个新的string对象并返回

//例如我想找到一个文件后缀名
string s1("test.cpp");
int pos = s1.rfind('.');
string s2 = s1.substr(pos);
cout << s2 << endl;

结果:

13.find_first_of:从s1中找是否存在我传过去的字符串中的任意一个字符,如果比对成功则返回下标

这个接口作者本人觉得命名不太好,应该改成find_any_of会更容易理解一些

string s1("hello world");
cout<<s1.find_first_of("abcde")<<endl;

结果:

string s1("hello world");
//从下标为3的位置开始找
cout<<s1.find_first_of("abcde",3)<<endl;

结果:

还有一个接口是find_last_of,而这个接口就是将find_first_of换成倒着找而已。说实话这个名字取得也有点矬,应该取名为rfind_any_of会更好一些(作者吐槽)。

14.operator+

string s1("abc");
string s2 = "de" + s1;
cout << s2 << endl;

结果:

15.getline:默认遇到\n才会停止在缓冲区中取数据(cin默认遇到空格和\n就会停止在缓冲区中取数据)

string s1;
//默认遇到\n才会停止取数据
getline(cin, s1);
cout << s1 << endl;

结果:

string s1;
//默认遇到*才会停止取数据
getline(cin, s1,'*');
cout << "——————————————"<<endl;
cout << s1 << endl;

结果:

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

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

相关文章

BLE 协议之链路层

目录 一、前言二、状态和角色三、Air Interface Packets1、Preamble 字段2、Access Address 字段2.1 静态地址2.2 私有地址 3、PDU 字段3.1 Advertising Channel PDU3.1.1 Header 字段3.1.2 Payload 字段 3.2 Data Channel PDU3.2.1 Header 字段3.2.2 Payload 字段 4、CRC 字段…

YOLO交通目标识别数据集(红绿灯-汽车-自行车-卡车等)

YOLO交通目标识别 数据集 模型 ui界面 ✓图片数量15000&#xff0c;xml和txt标签都有&#xff1b; ✓class&#xff1a;biker&#xff0c;car&#xff0c;pedestrian&#xff0c;trafficLight&#xff0c;trafficLight-Green&#xff0c;trafficLight-GreenLeft&#xff0c; t…

OpenCV特征检测(3)计算图像中每个像素处的特征值和特征向量函数cornerEigenValsAndVecs()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算图像块的特征值和特征向量用于角点检测。 对于每一个像素 p &#xff0c;函数 cornerEigenValsAndVecs 考虑一个 blockSize blockSize 的邻…

Ferret-UI——于移动用户界面的多模态大规模语言模型

概述 论文地址&#xff1a;https://arxiv.org/abs/2404.05719 移动应用程序已成为我们日常生活中不可或缺的工具&#xff0c;涉及信息搜索、预订和娱乐等多个领域。我们通常会目测屏幕&#xff0c;然后根据自己的目的执行必要的操作。将这一过程自动化可以让用户更轻松地实现…

【秋招笔试-支持在线评测-试读版】9.19小米秋招(已改编)-三语言题解

&#x1f36d; 大家好这里是 春秋招笔试突围&#xff0c;一起备战大厂笔试 &#x1f4bb; ACM金牌团队&#x1f3c5;️ | 多次AK大厂笔试 &#xff5c; 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; 和 手里的小花花…

阿贝云评测:免费虚拟主机和免费云服务器体验分享

最近我有幸体验了阿贝云提供的免费虚拟主机和免费云服务器&#xff0c;在这里分享一下我的使用体验。首先我想说的是&#xff0c;阿贝云的服务真的很不错。他们提供的免费虚拟主机性能稳定&#xff0c;速度快&#xff0c;对于刚开始建站的小伙伴来说是一个很好的选择。免费云服…

阿里发布史上最大规模开源全家桶!千问2.5系列发布

实话说&#xff0c;我一直没想明白阿里为什么会在大模型这个赛道&#xff0c;成为中国版的Meta。 扎克伯格被问及为什么要做开源大模型时说&#xff0c;“我们的商业模式并不是靠卖模型赚钱“。显然&#xff0c;Meta没有云平台产品&#xff0c;就算要卖模型赚钱&#xff0c;效…

前端vue-单选按钮的实现

要把name“sex”和value"男" 和 要把name“sex”和value"女"写上&#xff0c;然后在各自的标签内部写上v-model绑定属性。data中定义v-model的绑定值&#xff0c;后面的值是默认选中的男或者女性。

B站前端错误监控实践

前言 从23年开始&#xff0c;我们团队开始前端错误监控方向的开发。经历了一些列的迭代和发展&#xff0c;从监控SDK、上报、数据治理、看板集成、APM自研可视化初步完成了一条完整且适合B站前端监控。 截止目前(2024.08.01)&#xff0c;前端监控在B站85%以上的业务线&#xf…

Percona发布开源DBaaS平台;阿里云RDS发布全球多活数据库(GAD);Redshift支持自然语言生成SQL

重要更新 1. 云栖大会于本周四/五在杭州举行&#xff0c;周五上午云栖主论坛阿里云数据库负责人李飞飞将发表《从数据到智能&#xff1a;DataAI驱动的云原生数据库》演讲&#xff0c;另外&#xff0c;还有多场次的数据库专场&#xff0c;感兴趣的可以现场或在线观看&#xff1a…

前端vue-自己封装组件并使用三步走

在components下&#xff0c;创建.vue文件&#xff0c;里面正常写样式什么的&#xff0c;在需要引用的文件内先在script标签内引入在components下创建的组件&#xff0c;再导出处使用&#xff0c;再在templete标签内直接使用自己封装的组件。

SQL - 基础语法

SQL作为一种操作命令集, 以其丰富的功能受到业内人士的广泛欢迎, 成为提升数据库操作效率的保障。SQL Server数据库的应用&#xff0c;能够有效提升数据请求与返回的速度&#xff0c;有效应对复杂任务的处理&#xff0c;是提升工作效率的关键。 由于SQL Servers数据库管理系统…

【学术会议:中国杭州,机器学习和计算机应用面临的新的挑战问题和研究方向】第五届机器学习与计算机应用国际学术会议(ICMLCA 2024)

您的学术研究值得被更多人看到&#xff01; 在这里&#xff0c;我为您提供精准的会议推荐&#xff0c;包括水利土木工程、计算机科学、地球科学、机械自动化、材料与制造技术、经管金融、人文社科等主流学科相关领域的国际会议。快速的稿件录用和高效的检索服务将确保您的研究…

平价头戴式蓝牙耳机有哪些?四款公认平价性能超强品牌机型推荐

在追求高品质音乐体验的同时&#xff0c;许多消费者希望找到价格亲民的头戴式蓝牙耳机&#xff0c;市场上不乏性能卓越、价格实惠的产品&#xff0c;它们凭借出色的音质、舒适的佩戴体验和可靠的续航能力赢得了用户的青睐&#xff0c;那么在众多的头戴式蓝牙耳机内&#xff0c;…

Android 空气质量刻度

效果 attrs.xml <attr name"textSpace" format"dimension|reference" /><attr name"barSpace" format"dimension|reference" /><attr name"scaleHeight" format"dimension|reference" /><at…

在 Windows 上运行 Vue 项目时解决 ‘NODE_OPTIONS‘ 错误

在 Windows 上运行 Vue 项目时解决 ‘NODE_OPTIONS’ 错误 在 Windows 系统上启动 Vue 项目时&#xff0c;遭遇报错。具体报错信息如下&#xff1a; ‘NODE_OPTIONS‘ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。这个错误通常意味着 Windows 系统无法识…

SimpleAISearch:C# + DuckDuckGo 实现简单的AI搜索

最近AI搜索很火爆&#xff0c;有Perplexity、秘塔AI、MindSearch、Perplexica、memfree、khoj等等。 在使用大语言模型的过程中&#xff0c;或许你也遇到了这种局限&#xff0c;就是无法获取网上最新的信息&#xff0c;导致回答的内容不是基于最新的信息&#xff0c;为了解决这…

企业微信redirect_uri 与配置的授权完成回调域名不一致

这有几个前提 你先排除下 1、第三方方应用的使用配置里&#xff0c;这一排域名&#xff0c;一定要和你的回调域名一致 2、官方的设置授权配置里》 https://developer.work.weixin.qq.com/document/path/90602 在你还没上线的第三方应用前&#xff01;&#xff01;&#xff0…

FreeRTOS(三)FreeRTOS任务挂起和恢复与中断

在 FreeRTOS 中&#xff0c;任务挂起&#xff08;Suspend&#xff09;和恢复&#xff08;Resume&#xff09;是用于控制任务执行流程的两个重要操作。挂起一个任务会使其暂停执行&#xff0c;而恢复一个任务则使其重新进入调度器的考虑范围&#xff0c;可能在适当的时候被调度执…

开源笔记Joplin本地Docker部署结合内网穿透实现多设备端同步笔记

文章目录 前言1. 安装Docker2. 自建Joplin服务器3. 搭建Joplin Sever4. 安装cpolar内网穿透5. 创建远程连接的固定公网地址 前言 本文主要介绍如何在自己的服务器上利用docker搭建 Joplin Server&#xff0c;并对同步进行配置&#xff0c;再结合cpolar内网穿透工具实现公网远程…