string容器的常用操作

string容器的常用操作

  • 一、C语言中的字符串
  • 二、string容器
    • 1、概念
    • 2、特点
  • 三、string类对象的常见构造
    • 1、构造
    • 2、实际构造函数
    • 3、测试代码
    • 4、运行结果
  • 四、赋值运算符
    • 1、类型
    • 2、作用
    • 3、测试代码
    • 4、运行结果
  • 五、string类对象的容量操作
    • 1、成员函数
    • 2、测试代码
    • 3、说明
    • 4、运行结果
  • 六、运算符[]
    • 1、类型
    • 2、作用
    • 3、测试代码
    • 4、运行结果
    • 5、错误代码与编译器报错
  • 七、迭代器
    • 1、类型
    • 2、概念
    • 3、测试代码
    • 4、运行结果
    • 5、总结
  • 八、增加字符的函数
    • 1、类型
    • 2、作用
    • 3、测试代码
    • 4、运行结果
    • 5、总结
  • 九、c_str
    • 1、类型
    • 2、作用
    • 3、测试代码
    • 4、运行结果
    • 5、总结
  • 十、搜寻与截取
    • 1、类型
    • 2、作用
    • 3、测试代码
    • 4、运行结果

一、C语言中的字符串

在C语言中,字符串是以\0结尾的一串字符的集合,而为了操作方便,C标准库中提供了一些str系列的库函数,比如,strcpy、strlen、strcmp等等。但是这些库函数与字符串是分离开的,不太符合OOP的思想(面向对象编程(Object Oriented Programming)),而且底层空间需要用户自己管理,稍不留神可能就会有越界访问的问题发生。

二、string容器

1、概念

string容器是c++中表示字符序列的一个类,同时也是一个类模板。它提供了许多成员函数和运算符重载,封装了C++中对字符串的常见操作和功能,提供了更高级的字符串处理能力,并且隐藏了底层的实现细节,使得字符串的操作更加方便和安全。但string类是一个泛型类,它是由模板实例化出来的一个标准类,本质上不是一个标准数据类型。详情参见上方string容器文档。

2、特点

  • 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符和字符串的设计特性。
  • string类是basic_string模板类的一个实例,它使用char作为basic_string模板类的类型去实例化,并用char_traits和allocator作为basic_string的默认参数(模板的概念参见模板和STL简介)。
  • string类处理字节与使用的编码无关。即如果用于处理多字节或可变长度字符(如 UTF-8)的序列,则此类的所有成员(如长度或大小)及其迭代器仍将以字节(而不是实际编码字符)为单位运行。
  • 在使用string类时,必须用#include包含它的头文件string以及使用标准命名空间std。

三、string类对象的常见构造

1、构造

常用构造函数名称功能说明
string()创建一个空的string类对象,即空字符串
string(const char* s)用C语言格式的字符串来构造string类对象
string(size_t n, char c)创建一个包含n个字符c的string类对象
string(const string& str)string类的拷贝构造函数,用对象str创建一个string类对象

2、实际构造函数

在这里插入图片描述

3、测试代码

#include<iostream>
#include<string>
using namespace std;void Test_string1()
{string s1;cout << s1 << endl;string s2("snow dragon");cout << s2 << endl;string s3(6, 's');cout << s3 << endl;string s4(s2);cout << s4 << endl;
}int main()
{try{Test_string1();}catch (const std::exception& e){cout << e.what() << endl;}return 0;
}
  • main函数中的try与catch的作用是捕获异常。

4、运行结果

在这里插入图片描述

四、赋值运算符

1、类型

在这里插入图片描述

2、作用

=运算符用一个新值为string对象的字符串赋值,它会替换掉string对象字符串之前的内容。

3、测试代码

int main()
{string s1;string s2 = "snow dragon"; // 调用构造函数 + 拷贝构造 -> 编译器优化 --> 直接调用构造函数创建对象s2cout << s1 << endl;cout << s2 << endl;s1 = s2;cout << s1 << endl;s1 = "ssss";cout << s1 << endl;s1 = 's';cout << s1 << endl;return 0;
}

4、运行结果

在这里插入图片描述

五、string类对象的容量操作

1、成员函数

函数名称功能说明
size_t size() const;返回字符串的长度(以字节为单位)。
size_t capacity() const;返回当前为字符串分配的存储空间的大小,以字节表示。
bool empty() const;返回字符串是否为空,即其长度是否为 0。
void clear();擦除字符串的内容,该字符串将成为空字符串(长度为 0 个字符)。
void reserve (size_t n = 0);请求更改容量的大小,对字符串(对象)长度没有影响,并且无法更改其内容。
void resize (size_t n);void resize (size_t n, char c);将字符串的大小调整为n个字符的长度,即修改size。

2、测试代码

void Test_string2()
{string s1("snow");cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;cout << s1.empty() << endl;cout << "***************************" << endl;string s2;cout << s2.empty() << endl;cout << "***************************" << endl;string s3("snow");cout << s3 << endl;cout << s3.size() << endl;s3.resize(10, '!');cout << s3 << endl;cout << s3.size() << endl;s3.resize(3);cout << s3 << endl;cout << s3.size() << endl;cout << "***************************" << endl;string s4;s4.reserve(100);cout << s4.size() << endl;cout << s4.capacity() << endl;s4.reserve(50);cout << s4.size() << endl;cout << s4.capacity() << endl;cout << "***************************" << endl;s1.clear();cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;
}

3、说明

  • string类对象的容量操作函数中其实还有函数size_t length() const。只不过它不常用,并且size()与length()函数的底层实现原理完全相同,这里引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是使用函数size()。
  • 函数clear()只是将string中有效字符清空,即将string对象中的字符串清空时,只是将size置为0,但不改变对象的底层空间大小。
  • resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)是用0来对多出的空间的元素进行赋值,resize(size_t n, char c)是用字符c来对多出的空间的元素进行赋值。
  • resize在改变元素个数时,如果是将元素个数增多,可能会改变容量空间的大小,如果是将元素个数减少,则它的容量空间不会改变。
  • reserve(size_t res_arg=0);的作用是为string对象预留空间,它不改变有效元素个数,即对容量空间大小进行处理。但当reserve的参数小于string的容量空间总大小时,reserver不会改变容量空间的大小。

4、运行结果

在这里插入图片描述

六、运算符[]

1、类型

在这里插入图片描述

2、作用

返回string对象字符串下标为pos的字符的引用。

3、测试代码

void Test2()
{string s1("snow dragon");cout << s1[0] << endl;cout << s1 << endl;s1[0] = 'h';cout << s1[0] << endl;cout << s1 << endl;//遍历string对象并对它的每个字符+1for (size_t i = 0; i < s1.size(); ++i){s1[i]++;}cout << s1 << endl;const string s2("dragon");for (size_t i = 0; i < s2.size(); ++i){//s2[i]++;cout << s2[i] << " ";}cout << endl;cout << s2 << endl;//cout << s2[10] << endl;			//编译器内部会检查是否越界
}

4、运行结果

在这里插入图片描述

5、错误代码与编译器报错

在这里插入图片描述

七、迭代器

1、类型

在这里插入图片描述

2、概念

迭代器是一种检查容器内的元素并遍历元素的数据类型,通常用于对C++中各种容器内的元素进行访问。

3、测试代码

void Test3()
{cout << "s1 test" << endl;string s1("snow");cout << s1 << endl;string::iterator it1 = s1.begin();while (it1 != s1.end()){(*it1)++;cout << *it1 << " ";++it1;}cout << endl;//范围for: 自动迭代,自动判断结束。底层其实就是迭代器//下方为使用范围for依次取s1中的每个字符并赋值给ch,再将ch自增1,最后输出for (auto& ch : s1){ch++;cout << ch << " ";}cout << endl;cout << s1 << endl;cout << "s2 test" << endl;string s2("snow dragon");cout << s2 << endl;string::reverse_iterator rit2 = s2.rbegin();while (rit2 != s2.rend()){cout << *rit2 << " ";++rit2;}cout << endl;cout << "s3 test" << endl;const string& s3("snow dragon");cout << s3 << endl;//string::const_iterator it3 = s3.begin();auto it3 = s3.begin();while (it3 != s3.end()){//*it3 = 'x';cout << *it3 << " ";++it3;}cout << endl;cout << "s3 reverse iterator test" << endl;//auto rit3 = s3.rbegin();string::const_reverse_iterator rit3 = s3.rbegin();while (rit3 != s3.rend()){cout << *rit3 << " ";++rit3;}cout << endl;
}

4、运行结果

在这里插入图片描述

5、总结

  • string和vector都不喜欢用iterator,因为[]更好用,而list、map和set等等只能用迭代器进行访问。
  • iterator是所有容器通用的访问方式,即所有容器的用法都是类似的。
  • iterator的用法像指针一样,它的底层实现有可能就是用指针实现的,也有可能不是,具体要看容器本身。

八、增加字符的函数

1、类型

在这里插入图片描述

2、作用

  • push_back是在string对象字符串的末尾添加一个字符。
  • append是在string对象字符串的末尾添加一个字符串。
  • +=运算符是在string对象字符串的末尾添加一个字符或字符串。
  • 它们三个将改变字符串的实际大小size和容量空间,如果string对象字符串的容量空间不足,它们会自动对string对象字符串进行增容。

3、测试代码

void Test4()
{string s("snow");s.push_back('-');s.push_back('-');s.append("dragon");cout << s << endl;string str("coming");s += '@';s += str;s += "!!!";cout << s << endl;s.append(++str.begin(), --str.end());cout << s << endl;string copy1(++s.begin(), --s.end());cout << copy1 << endl;string copy2(s.begin() + 5, s.end() - 5);cout << copy2 << endl;
}

4、运行结果

在这里插入图片描述

5、总结

  • 在string尾部追加字符时,s.push_back( c ) / s.append(1, c) / s += 'c’三种实现方式是差不多的。
  • 一般情况下string类的+=操作用的比较多,因为它不仅可以连接单个字符,还可以连接字符串。

九、c_str

1、类型

在这里插入图片描述

2、作用

c_str将调用它的string对象字符串转换为一个字符数组,该数组是以\0结尾的,最后返回指向这个数组的指针。

3、测试代码

void Test5()
{string name("snow");cout << name << endl;cout << name.c_str() << endl;name += '\0';name += "dragon";cout << name << endl;cout << name.c_str() << endl;cout << name.size() << endl;string copy = name;cout << copy << endl;cout << '\0' << endl;cout << "end" << endl;
}

4、运行结果

在这里插入图片描述

5、总结

  • string对象字符串的大小是由它的实际大小size决定的,当输出时,将输出到下标为size - 1时才结束,因为下标为size处的值为\0。
  • 当输出string对象时,\0默认是不输出的。
  • 常量字符串对象或用string对象转换为C类型的字符串时,字符串的结束标志是\0。

十、搜寻与截取

1、类型

在这里插入图片描述

2、作用

  • find是在字符串中搜索其第一个形参,如果在string对象(字符串)中找到了,则返回开始匹配处的下标;当形参pos指定时,find只搜索字符串下标位置pos处和它之后的字符,pos之前的字符不搜寻;当搜索多个字符时,即find的第一个形参是个字符串时,在string对象中搜寻的序列需要和该形参整个序列都匹配才行。
  • rfind与find类似,只是它从字符串的尾部开始搜寻,pos指定时和find的搜寻顺序相反。
  • substr在调用它的对象的字符串中,从pos位置开始,截取len个字符,然后用截取到的字符序列创建一个string对象并将其返回。
  • npos是一个静态成员常量值,是类型size_t的最大值。当它在字符串的成员函数中用作len(或 sublen)参数的值时,表示直到字符串结束为止。当它作为返回值时,通常用于表示没有找到匹配项。

3、测试代码

void DealUrl(const string& url)
{size_t pos1 = url.find("://");if (pos1 == string::npos){cout << "非法url" << endl;return;}string protocol = url.substr(0, pos1);cout << protocol << endl;size_t pos2 = url.find('/', pos1 + 3);if (pos2 == string::npos){cout << "非法url" << endl;return;}string domain = url.substr(pos1 + 3, pos2 - pos1 - 3);cout << domain << endl;string uri = url.substr(pos2 + 1);cout << uri << endl;
}void Test6()
{string name("snow.dragon.happy.everyday");//输出前缀size_t pos = name.find('.');if (pos != string::npos){string suff = name.substr(0, pos);cout << suff << endl;}//输出后缀pos = name.rfind('.');if (pos != string::npos){string suff = name.substr(pos);cout << suff << endl;}string url1 = "https://legacy.cplusplus.com/reference/string/string/find/";cout << url1 << endl;DealUrl(url1);
}

4、运行结果

在这里插入图片描述

本文到这里就结束了,如有错误或者不清楚的地方欢迎评论或者私信
创作不易,如果觉得博主写得不错,请务必点赞、收藏加关注💕💕💕

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

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

相关文章

Qt应用开发(基础篇)——复选按钮 QCheckBox 单选按钮 QRadioButton

一、前言 QCheckBox类与QRadioButton类继承于QAbstractButton&#xff0c;QCheckBox是一个带有文本标签的复选框&#xff0c;QRadioButton是一个带有文本标签的单选按钮。 按钮基类 QAbstractButton QCheckBox QCheckBox复选框是一个很常用的控件&#xff0c;拥有开关(选中和未…

WPF Flyout风格动画消息弹出消息提示框

WPF Flyout风格动画消息弹出消息提示框 效果如图&#xff1a; XAML: <Window x:Class"你的名称控件.FlyoutNotication"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xam…

短信软件平台搭建最新客户端|移讯云短信系统

根据客户 和市场需要 增加了新的客户端 新的客户端客户登录后发送短信时可自行选择用哪个通道来进行发送短信。每个通道的充值数量不一样。 通过后台给客户分配可使用的通道&#xff0c;只有在后台给客户分配可使用的通道后客户在登录客户端发送短信时才可进行选择。 关于客…

整理mongodb文档:事务(一)

个人博客 整理mongodb文档:事务(一) 原文链接&#xff0c;个人博客 求关注&#xff0c;本文主要讲下怎么在mongose下使用事务&#xff0c;建议电脑端看 文章概叙 本文的开发环境为Nodejs&#xff0c;在‘单机模式’讲解最基本的事务概念。并没有涉及分片以及集群&#xff0…

垃圾回收 - 标记压缩算法

压缩算法是将标记清除算法与复制算法相结合的产物。 1、什么是标记压缩算法 标记压缩算法是由标记阶段和压缩阶段构成。 首先&#xff0c;这里的标记阶段和标记清除算法时提到的标记阶段完全一样。 接下来我们要搜索数次堆来进行压缩。压缩阶段通过数次搜索堆来重新填充活动对…

C#,《小白学程序》第十五课:随机数(Random)第二,统计学初步,数据统计的计算方法与代码

1 文本格式 /// <summary> /// 《小白学程序》第十五课&#xff1a;随机数&#xff08;Random&#xff09;第二&#xff0c;统计学初步&#xff0c;数据统计的计算方法与代码 /// 用随机数做简单的统计并用图形显示统计结果。 /// </summary> /// <param name&q…

vue中v-for循环数组使用方法中splice删除数组元素(每次都删掉点击的下面的一项)

总结&#xff1a;平常使用v-for的key都是使用index&#xff0c;这里vue官方文档也不推荐&#xff0c;这个时候就出问题了&#xff0c;我们需要key为唯一标识&#xff0c;这里我使用了时间戳&#xff08;new Date().getTime()&#xff09;处理比较复杂的情况&#xff0c; 本文章…

2020年12月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C编程&#xff08;1~8级&#xff09;全部真题・点这里 第1题&#xff1a;字符三角形 描述 给定一个字符&#xff0c;用它构造一个底边长5个字符&#xff0c;高3个字符的等腰字符三角形。 输入 输入只有一行&#xff0c; 包含一个字符。 输出 该字符构成的等腰三角形&#xff…

C++ - 多态的实现原理

前言 本博客主要介绍C 当中 多态语法的实现原理&#xff0c;如果有对 多态语法 有疑问的&#xff0c;请看下面这篇博客&#xff1a; C - 多态语法 - 虚函数使用介绍-CSDN博客 探究&#xff0c;为什么多态的条件是那样的&#xff08;虚函数表&#xff09; 首先&#xff0c;调用…

qt day6 人脸识别

在C和C中static关键字的用法 static修饰局部变量、全局变量&#xff08;不能被外部引用extern|未初始化的值为0&#xff09;、函数&#xff08;不能被外部引用extern&#xff09;&#xff0c;不能修饰auto类型的指针&#xff08;因为计算机先为静态变量分配空间&#xff0c;后再…

重磅|Falcon 180B 正式在 Hugging Face Hub 上发布!

引言 我们很高兴地宣布由 Technology Innovation Institute (TII) 训练的开源大模型 Falcon 180B 登陆 Hugging Face&#xff01;Falcon 180B 为开源大模型树立了全新的标杆。作为当前最大的开源大模型&#xff0c;有180B 参数并且是在在 3.5 万亿 token 的 TII RefinedWeb 数据…

打造基于终端命令行的IDE,Termux配置Vim C++开发环境

Termux配置Vim C开发环境&#xff0c;打造基于终端命令行的IDE 主要利用VimCoc插件&#xff0c;配置C的代码提示等功能。 Termux换源 打开termux&#xff0c;输入termux-change-repo 找到mirrors.tuna.tsinghua.edu.cn&#xff0c;清华源&#xff0c;空格选中&#xff0c;回…

Hadoop Hive入门

0目录 1.linux 安装hive 2.hive入门 3.hive高级语法1 1.linux 安装hive 先确保linux虚拟机中已经安装jdk&#xff1b;mysql和hadoop 并可以成功启动hadoop和mysql 下载hive对应版本到opt/install目录下并解压到opt/soft目录下 重命名 hive312 配置profile 文件&#xff…

Qt+C++桌面计算器源码

程序示例精选 QtC桌面计算器源码 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<QtC桌面计算器源码>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与…

Hadoop的第二个核心组件:MapReduce框架第二节

Hadoop的第二个核心组件&#xff1a;MapReduce框架第二节 六、MapReduce的工作流程原理&#xff08;简单版本&#xff09;七、MapReduce中的序列化机制问题八、流量统计案例实现&#xff08;序列化机制的实现&#xff09; 六、MapReduce的工作流程原理&#xff08;简单版本&…

Flutter实用工具Indexer列表索引和Search搜索帮助。

1.列表索引 效果图&#xff1a; indexer.dart import package:json_annotation/json_annotation.dart;abstract class Indexer {///用于排序的字母JsonKey(includeFromJson: false, includeToJson: false)String? sortLetter;///用于排序的拼音JsonKey(includeFromJson: fal…

如何有效防止服务器被攻击?

随着互联网的快速发展&#xff0c;服务器安全问题日益引起人们的关注。近期&#xff0c;全球范围内频繁发生的服务器攻击事件引发了广泛关注。为了保护企业和个人的数据安全&#xff0c;有效防止服务器被攻击已成为迫在眉睫的任务。 首先&#xff0c;及时更新服务器的操作系统和…

基于SpringBoot的医院挂号系统

基于SpringBootVue的医院挂号、预约、问诊管理系统&#xff0c;前后端分离 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 角色&#xff1a;管理员、用户、医生 管…

系统架构技能之设计模式-组合模式

一、上篇回顾 我们上篇主要讲述了结构型模式中的外观模式&#xff0c;外观模式作为结构型模式中的一个简单又实用的模式&#xff0c;外观模式通过封装细节来提供大粒度的调用&#xff0c; 直接的好处就是&#xff0c;封装细节&#xff0c;提供了应用写程序的可维护性和易用性。…

十二、集合(4)

本章概要 集合 Set映射 Map队列 Queue 优先级队列 PriorityQueue 集合与迭代器 集合Set Set 不保存重复的元素。 如果试图将相同对象的多个实例添加到 Set 中&#xff0c;那么它会阻止这种重复行为。 Set 最常见的用途是测试归属性&#xff0c;可以很轻松地询问某个对象是否…