C++ : STL容器之string剖析

在这里插入图片描述

STL容器之string剖析

  • 一、string 的迭代器
    • (一)起始迭代器
    • (二)末尾迭代器
    • (三)反向迭代器
  • 二、容量相关的函数
    • (一)size
    • (二)capacity
    • (三)resize
    • (四)reserve
    • (五)clear
    • (六)empty
  • 三、元素的访问和修改
    • (一)[ ]操作符重载和 at
    • (二)front 和 back
  • 三、元素的修改
    • (一)+= 运算符重载
    • (二)append
    • (三)push_back
    • (四)assign
    • (五)insert
    • (六)erase
    • (七)pop_back
  • 四、其它操作函数
    • (一)c_str
    • (二)substr
    • (三)find
  • 五、其他成员
    • (一)静态成员 npos
    • (二)全局函数 getline
    • 结束语

一、string 的迭代器

迭代器的原理:下面的实现中迭代器是由 typedef / using 关键字定义的类型

public:/*using iterator = char*;using const_iterator = const char*;*/typedef char* iterator;typedef const char* const_iterator;

(一)起始迭代器

返回第一个元素的迭代器
在这里插入图片描述

iterator begin()
{return _str;
}const_iterator begin() const
{return _str;
}

(二)末尾迭代器

返回最后一个元素的下一个位置的迭代器

在这里插入图片描述

	iterator end(){return _str + _size;}const_iterator end() const{return _str + _size;}

(三)反向迭代器

和前面两个迭代器的实现原理相同,但是在遍历的时候要记得用++,而不是- -。
在这里插入图片描述
在这里插入图片描述


void test05() {string s1("hello, world");std::string::reverse_iterator it = s1.rbegin();while (it != s1.rend()) {cout << *it;it++;  //这里要用++}
}

在这里插入图片描述

二、容量相关的函数

(一)size

返回函数的元素数量,不包含’\0’.
在这里插入图片描述

size_t size() const
{return _size;
}

(二)capacity

返回 string 申请空间的大小
在这里插入图片描述

(三)resize

修改函数的元素大小。

使用规则:
如果 n 小于当前字符串长度,则当前值将缩短为其前 n 个字符,并删除第 n个字符以外的字符
如果 n 大于当前字符串长度,则通过在末尾插入所需数量的字符来扩展当前内容,以达到 n 的大小。如果指定了 c,则新元素将初始化为 c 的副本,否则,它们是值初始化字符(空字符)。

在这里插入图片描述

(四)reserve

请求根据计划的大小更改调整字符串容量,使得容量至少为 n 个字符
如果 n 大于当前字符串容量,则该容器将其容量增加到 n 个字符(或更大)除此之外,不做其他的改变。
此函数对字符串长度没有影响,也无法更改其内容。

在这里插入图片描述
在这里插入图片描述

(五)clear

清空字符串,使得元素数量改成0, 其它不改变。
在这里插入图片描述

void clear()
{_str[0] = '\0';_size = 0;
}

(六)empty

判断容器是否为空。
在这里插入图片描述

在这里插入图片描述

三、元素的访问和修改

(一)[ ]操作符重载和 at

重载[ ]操作符可以使得我们可以像数组一样的访问容器中的元素。重载有两个版本,const 对象使用const 版本,只读不可修改,普通版本可以读取和修改。
at 和[ ]几乎一致,只是写法上有略微差距。
在这里插入图片描述
在这里插入图片描述

		char& operator[](size_t i){assert(i >= 0 && i < _size);return _str[i];}const char& operator[](size_t i) const{assert(i >= 0 && i < _size);return _str[i];}

在这里插入图片描述

(二)front 和 back

分别返回起始元素和末尾元素,和[ ] 一样,分别都有两个版本。
在这里插入图片描述
在这里插入图片描述

三、元素的修改

(一)+= 运算符重载

+= 是很好用的一个追加字符 / 字符串的运算符。
在这里插入图片描述

(二)append

在字符串末尾追加字符 / 字符串,版本有很多。
在这里插入图片描述

(三)push_back

在末尾追加字符,其实和前面两者区别不大,为了达到容器的一致性而添加的字符。
在这里插入图片描述

(四)assign

相当于构造函数,构造方式更多样化,下面的接口都有很多一致性。和追加的这套体系很像。
在这里插入图片描述

#include <iostream>
#include <string>int main ()
{std::string str;std::string base="The quick brown fox jumps over a lazy dog.";// used in the same order as described above:str.assign(base);std::cout << str << '\n';str.assign(base,10,9);std::cout << str << '\n';         // "brown fox"str.assign("pangrams are cool",7);std::cout << str << '\n';         // "pangram"str.assign("c-string");std::cout << str << '\n';         // "c-string"str.assign(10,'*');std::cout << str << '\n';         // "**********"str.assign<int>(10,0x2D);std::cout << str << '\n';         // "----------"str.assign(base.begin()+16,base.end()-12);std::cout << str << '\n';         // "fox jumps over"return 0;
}

(五)insert

insert 函数的用法和之前都有一致性,只是多加了两个迭代器版本和插入元素的位置,因为涉及到数据的挪动,因此时间复杂度比较高,在项目中不建议使用。
在这里插入图片描述

#include <iostream>
#include <string>int main ()
{std::string str="to be question";std::string str2="the ";std::string str3="or not to be";std::string::iterator it;// used in the same order as described above:str.insert(6,str2);                 // to be (the )questionstr.insert(6,str3,3,4);             // to be (not )the questionstr.insert(10,"that is cool",8);    // to be not (that is )the questionstr.insert(10,"to be ");            // to be not (to be )that is the questionstr.insert(15,1,':');               // to be not to be(:) that is the questionit = str.insert(str.begin()+5,','); // to be(,) not to be: that is the questionstr.insert (str.end(),3,'.');       // to be, not to be: that is the question(...)str.insert (it+2,str3.begin(),str3.begin()+3); // (or )std::cout << str << '\n';return 0;
}

(六)erase

和 insert类似,由于牵涉到数据的挪动,因此并不推荐使用。
在这里插入图片描述

(七)pop_back

用来弹出最后一个字符
在这里插入图片描述

四、其它操作函数

(一)c_str

这个函数用来得到 string 里面的字符串,由于返回的是const 类型,因此要使用的话需要拷贝一份
在这里插入图片描述
实现原理

	const char* c_str() const{return _str;}

使用样例

#include <iostream>
#include <cstring>
#include <string>int main ()
{std::string str ("Please split this sentence into tokens");char * cstr = new char [str.length()+1];std::strcpy (cstr, str.c_str());// cstr now contains a c-string copy of strchar * p = std::strtok (cstr," ");while (p!=0){std::cout << p << '\n';p = std::strtok(NULL," ");}delete[] cstr;return 0;
}

(二)substr

用来获取 string 容器的字串,返回一份拷贝。
在这里插入图片描述
实现原理

string string::substr(size_t pos, size_t len)
{assert(pos >= 0 && pos < _size);if (len > _size - pos) {len = _size - pos;}WGM::string s;s.reserve(len);for (int i = 0; i < len;i++){s._str[i] = _str[pos++];}return s;
}

(三)find

查找指定的字符 / 字符串 / string串,默认从0位置开始查找。
一般和npos混合起来使用,来判断是否找到目标字符串。
在这里插入图片描述
使用样例

#include <iostream>       // std::cout
#include <string>         // std::stringint main()
{std::string str("There are two needles in this haystack with needles.");std::string str2("needle");// different member versions of find in the same order as above:std::size_t found = str.find(str2);if (found != std::string::npos)std::cout << "first 'needle' found at: " << found << '\n';found = str.find("needles are small grkwgeio", found + 1,  1);if (found != std::string::npos)std::cout << "second 'needle' found at: " << found << '\n';found = str.find("haystack");if (found != std::string::npos)std::cout << "'haystack' also found at: " << found << '\n';found = str.find('.');if (found != std::string::npos)std::cout << "Period found at: " << found << '\n';// let's replace the first needle:str.replace(str.find(str2), str2.length(), "preposition");std::cout << str << '\n';return 0;
}

五、其他成员

(一)静态成员 npos

用来表示整形的最大值
在这里插入图片描述

(二)全局函数 getline

从流中提取字符串到 str 中,直到遇到限定标识符 delim结束, 不写的化自动是\n.
在这里插入图片描述

结束语

许久未更,从头开始!接下来还会带来 Linux 的文章,小编会继续更新有用的内容!

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

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

相关文章

【java】数据类型与变量以及操作符

各位看官&#xff1a;如果您觉得这篇文章对您有帮助的话 欢迎您分享给更多人哦 感谢大家的点赞收藏评论&#xff0c;感谢您的支持&#xff01;&#xff01;&#xff01; 目录 一.字面变量&#xff1a; 二&#xff1a;数据类型 1.1&#xff1a;int类型&#xff1a;&#xff0…

无人机(自组穿越机,航模)-芯片选型

飞控MCU: 型号尺寸子型号参数规格备注STM325*532位ARM Cortex-M3 CPU&#xff0c;72MHz&#xff0c;256KB Flash&#xff0c;20KB RAMLQFP 48F33*332位ARM Cortex-M4 CPU&#xff0c;72MHz&#xff0c;256KB Flash&#xff0c;40KB RAMMPU6050F45*532位ARM Cortex-M4 CPU&…

github学生认证(Github Copilot)

今天想配置一下Github Copilot&#xff0c;认证学生可以免费使用一年&#xff0c;认证过程中因为各种原因折腾了好久&#xff0c;记录一下解决方法供大家参考。 p.s.本文章只针对Github学生认证部分遇到的问题及解决方法&#xff0c;不包括配置copilot的全部流程~ 1、准备工作…

如何使用ssm实现基于Java的校园二手物品交易平台的设计与实现+vue

TOC ssm789基于Java的校园二手物品交易平台的设计与实现vue 绪论 1.1 研究背景 在这个推荐个性化的时代&#xff0c;采用新技术开发一个校园二手物品交易平台来分享和展示内容是一个永恒不变的需求。本次设计的校园二手物品交易平台有管理员&#xff0c;商家&#xff0c;用…

Git大框架总结

下面首先是我对于git的一个小总结&#xff0c;主要是大框架 首先是四区&#xff0c;因为大部分你所有的工作都是在这四个区里的实现的&#xff0c;包括要提交一个东西&#xff0c;是先是在工作区修改&#xff0c;后用add添加到暂存区&#xff0c;后提交到本地仓库&#xff0c;当…

系统架构设计师论文《论企业应用系统的分层架构风格》精选试读

论文真题 软件架构风格是描述一类特定应用领域中系统组织方式的惯用模式&#xff0c;反映了领域中诸多系统所共有的结构特征和语义特征&#xff0c;并指导如何将各个模块和子系统有效组织成一个完整的系统。分层架构是一种常见的软件架构风格&#xff0c;能够有效简化设计&…

基于WxJava框架的集客微信公众号的设计与实现(项目运行说明)

项目运行说明 数据库 系统采用MySQL数据库和Redis数据库,读者可参考在码云项目(code/yok/src/main/resources)中的application.yml中自行配置MySQL数据库,在redis.properties中配置Redis。 数据库表的创建语句在yok项目中的create_dataBase.sql文件中。 项目启动 后端项目…

JAVA思维提升

利用java做一个双色球彩票系统 要求 package ZY; import java.util.Random; import java.util.Scanner; public class Test9双色球 { //目标&#xff1a;模拟双色球//规则投注号码由6个红色球号码和1个蓝色球号码组成。红色球号码从1-33中选择;蓝色球号码从1-16中选择。publi…

ElasticSearch备考 -- Alias

一、题目 1) Create the alias hamlet that maps both hamlet-1 and hamlet-2 Verify that the documents grouped by hamlet are 8 2) Configure hamlet-3 to be the write index of the hamlet alias 二、思考 可以通过指定别名&#xff0c;来指向一个或多个索引&#xff0c…

Java环境配置

下载安装JDK 选择长期稳定的版本jdk-21 安装 安装好之后查看bin目录&#xff0c;里面存放了各种工具命令&#xff0c;有比较重要的javac和java。 javac.exe 是 Java 编译器&#xff0c;用于将 Java 源代码&#xff08;.java 文件&#xff09;编译成字节码&#xff08;.class…

白嫖EarMaster Pro 7简体中文破解版下载永久激活

EarMaster Pro 7 简体中文破解版功能介绍 俗话说得好&#xff0c;想要成为音乐家&#xff0c;就必须先拥有音乐家的耳朵&#xff0c;相信很多小伙伴都已经具备了一定的音乐素养&#xff0c;或者是说想要进一步得到提升。那我们就必须练好听耳的能力&#xff0c;并且把这种能力…

[C语言]指针和数组

目录 1.数组的地址 2.通过指针访问数组 3.数组和指针的不同点 4.指针数组 1.数组的地址 数组的地址是什么&#xff1f; 看下面一组代码 #include <stdio.h> int main() { int arr[5] {5,4,3,2,1}; printf("&arr[0] %p\n", &arr[0]); printf(&qu…

使用C语言进行图形化编程:从入门到实践的全面指南

1. 引言 随着技术的进步和个人电脑性能的提升&#xff0c;图形用户界面&#xff08;Graphical User Interface, GUI&#xff09;已经成为软件开发的重要组成部分。尽管C语言本身并不直接支持GUI编程&#xff0c;但借助各种库和框架&#xff0c;C语言也能成为创建功能强大且美观…

嵌入式硬件设计

嵌入式硬件设计是指针对嵌入式系统&#xff08;一种专用的计算机系统&#xff0c;通常嵌入到其他设备中&#xff09;进行的硬件设计工作。嵌入式系统广泛应用于消费电子、工业控制、医疗设备、汽车电子、航空航天等领域。以下是嵌入式硬件设计的主要内容和步骤&#xff1a; 1.…

【unity游戏开发】彻底理解AnimatorStateInfo,获取真实动画长度

前言 前置知识&#xff1a;设置参数后&#xff0c;下一个循环才会切换对应动画&#xff0c;所以在下一个循环获取真实的动画长度 AnimatorStateInfo是结构体&#xff01;值类型&#xff0c;要不断重复获取才是最新的 主要是自动设置trigger切换的动画自动切回上一个动画&#x…

域名劫持怎么处理?如何判断dns是否被劫持

随着网络环境的日益复杂&#xff0c;网站安全问题也日益凸显。域名劫持怎么处理&#xff1f;域名劫持是网站运营中不容忽视的安全威胁&#xff0c;在遇到域名劫持的时候应该学会应急响应、加强安全防护措施以及持续的安全维护&#xff0c;我们可以有效降低其带来的风险。 域名劫…

时间序列顶会一网打尽!时间序列基础模型的最新进展!

前言 最近时间序列基础模型领域&#xff0c;迎来了里程碑式的突破。 TimeGPT作为首个原生基础模型&#xff0c;于去年八月问世&#xff0c;一发布就震撼了预测领域。 众多其他基础模型也相继发布&#xff0c;包括但不限于&#xff1a; TimesFM MOIRAI Tiny Time Mixers&am…

鸿蒙next开发者第一课02.DevEcoStudio的使用-习题

【习题】DevEco Studio的使用 通过/及格分80/ 满分100 判断题 1. 如果代码中涉及到一些网络、数据库、传感器等功能的开发&#xff0c;均可使用预览器进行预览。F 正确(True)错误(False) 预览器不能进行传感器等特殊功能的开发,需要使用真机开发 2. module.json5文件中的…

C++ 观察者模式

观察者模式&#xff08;Observer Pattern&#xff09;是一种行为设计模式&#xff0c;用于在对象之间建立一对多的依赖关系&#xff0c;当一个对象的状态发生变化时&#xff0c;它的所有依赖对象都会得到通知并自动更新。 在观察者模式中&#xff0c;主题和观察者之间是松耦合…

Vue - 路由用法

前端路由就是URL中的hash与组件之间的对应关系。Vue Router是Vue的官方路由。 组成&#xff1a; VueRouter&#xff1a;路由器类&#xff0c;根据路由请求在路由视图中动态渲染选中的组件。<router-link>&#xff1a;请求链接组件&#xff0c;浏览器会解析成<a>。…