C++ : STL容器之string剖析

news2025/1/23 3:18:57

在这里插入图片描述

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 )question
  str.insert(6,str3,3,4);             // to be (not )the question
  str.insert(10,"that is cool",8);    // to be not (that is )the question
  str.insert(10,"to be ");            // to be not (to be )that is the question
  str.insert(15,1,':');               // to be not to be(:) that is the question
  it = str.insert(str.begin()+5,','); // to be(,) not to be: that is the question
  str.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 str

  char * 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::string

int 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.coloradmin.cn/o/2194560.html

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

相关文章

Unity3d使用JsonUtility.FromJson读取json文件

使用JsonUtility.FromJson方法不需要额外引用第三方库。该方法只能读取json对象&#xff0c;而不能读取json数组。 假如我们有如下的json数组&#xff1a; [ {"id":1, "name":"first2021", "level":5, "score":100, "…

cefsharp129.0.110(CEF 129.0.11,Chromium 129.0.6668.90)版本体验

一、依赖包 1.1 CefSharp.WinForms CefSharp.WinForms .NET Framework:net462 net462 is compatible. net463 net463 was computed. net47 net47 was computed. net471 net471 was computed. net472 net472 was computed. net48 net48 was computed. net481 1.2 CefSharp.…

JAVA思维提升

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

springboot网站开发-解决web前端请求的一个错误

springboot网站开发-解决web前端请求的一个错误&#xff01;近期在开发网站时&#xff0c;web页面&#xff0c;点击金币结算按钮时&#xff0c;一直报错&#xff0c;说金币余额不足。经过使用浏览器自带的js调试插件&#xff0c;一步一步跟踪调试&#xff0c;发现了原因。是漏写…

程计软题3-编译程序基本原理

(一)词法分析的工具-正规式 题1-语句找表达式 1. 排除法 对于A&#xff1a;a*取0个a&#xff0c;&#xff08;a&#xff09;*取1个a,b*取b,A例可取ab,不满足题目 对于C:取ba*取b,a*取1个a&#xff0c;&#xff08;b&#xff09;*,取ab&#xff0c;不满足题目 对于D:&#xff…

360桌面助手意见反馈

360桌面助手收纳盒和映射文件夹互转需求 现有方式 收纳盒 桌面新建收纳盒后, 可以在收纳盒内, 增加文件 映射文件夹 首先磁盘新建文件夹, 然后复制文件夹路径, 然后桌面右键, 新建映射文件夹, 把路径放进去, 实现闭合 存在的问题 收纳盒问题 桌面收纳盒过多后, 直接解散…

ArcGIS实战——一文教会你调整适合中国宝宝体质的标准地图投影参数

各位要出图的小伙伴有没有遇到一个问题&#xff0c;当我们的研究区域是中国时&#xff0c;使用常见的WGS1984投影&#xff0c;会让我们的中国地图看起来不够挺拔&#xff0c;投影使得左右的拉伸比较长&#xff0c;进而让我们的中国地图变得不够美观。就像下面这样子&#xff0c…

stable diffusion各种插件及模型、教程

stable diffusion各种插件及模型、教程 下载地址&#xff1a;https://s.tb.cn/c.0Efdko

31 基于51单片机的水位监测系统仿真

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;DHT11温湿度检测&#xff0c;水位检测&#xff0c;通过LCD1602显示&#xff0c;超过阈值报警&#xff0c;继电器驱动电机转动。通过矩阵按键切换选择设置各项参数阈值。 …

手机地址IP显示不对?别急,这里有解决方案

在当今的数字化生活中&#xff0c;手机已成为我们连接世界的重要工具。而手机的IP地址&#xff0c;作为我们在网络上的“身份证”&#xff0c;其准确性对于网络体验至关重要。然而&#xff0c;有时我们可能会遇到手机IP地址显示不正确的问题&#xff0c;这不仅会影响网络连接质…

《数据结构》学习系列——树

系列文章目录 目录 树的基本概念树的定义树的特点树的相关术语度层数高度路径二叉树定义特点定理满二叉树定义特点完全二叉树定义特点二叉树的存储结构顺序存储结点结构优点缺点 链式存储 结点结构三叉链表表示法算法搜索结点的父结点搜索符合数据域条件的结点删除给定结点及其…

【Python】物流行业数据分析与可视化案例

一&#xff0c;前言 在本文中&#xff0c;我将使用python语言基于Jupyter notebook对这一份物流行业数据集进行多维度数据分析&#xff0c;文章内容参考自b站马士兵《数据分析五大经典实战项目》教学视频&#xff0c;并对其中一些操作做出优化。 数据集下载地址&#xff1a;物流…

数组与集合的应用-数组演练

1、获取一维数组最小值 1.1 实例说明 一维数组常用于保存线性数据&#xff0c;例如数据库中的单行数据就可以使用一维数组保存。本实例接收用户在文本框中输入的单行数据&#xff0c;其中数据都是整数数字&#xff0c;以不同数量的空格分割数字&#xff0c;如图1所示。这个先行…

【英语】5. 作文的高级表达

文章目录 前言一、作用二、主干内容三、使用步骤总结参考文献 前言 高中时总结的[1]&#xff0c;现在接着用 一、作用 在各种考试的作文中使用&#xff0c;减少过于直白、没有 “文采” 的表达 二、主干内容 file:///C/Users/[username]/Desktop/Engs.txt[2023/6/15 23:47:4…

一些关于PID双闭环控制的思考

最近搭建了一个LCL型滤波器的三相逆变器&#xff0c;使用了双闭环控制&#xff0c;但是查到了几种不同的控制策略&#xff0c;比如外环可以是输出电压&#xff0c;也可以是输出电流&#xff0c;内环可以是三相桥侧电感&#xff0c;也可以是电容电流&#xff0c;而不管哪种内外环…

利士策分享,旅游是否要舟车劳顿才能尽兴?

利士策分享&#xff0c;旅游是否要舟车劳顿才能尽兴&#xff1f; 国庆假期&#xff0c;当夜幕降临&#xff0c;城市灯火阑珊&#xff0c;一场关于美食与等待的较量悄然上演。 李女士在北京天坛公园附近餐厅的等位经历——前方1053桌的壮观景象&#xff0c;不仅让人咋舌&#xf…

OpenAI预计明年将推出“代理”系统

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Kubernetes系列之一快速部署一套K8s集群(kubeadm方式)

最近本人在重温云原生相关的技术&#xff0c;说到云原生&#xff0c;必然绕不开Kubernetes&#xff0c;今天想跟大家聊的就是大名顶顶的Kubernetes。相信很多朋友在学习和使用Kubernetes的过程遇到各式各样不同的问题。我将从一个初学者的角度来给大家讲解一下Kubernete从安装、…

1006每日一题

2 https://leetcode.cn/problems/maximize-the-topmost-element-after-k-moves/ 如果真的是堆的话&#xff0c;没有任何思路 如果是栈的话&#xff0c;先去找最大值所在的索引m&#xff0c;判断与k的关系 如果m>k&#xff0c;说明删k个也无法到当前的最大值或者到了也没法再…

分享7款AI学术论文生成器!一键实现论文生成器chat在线生成

在当今的学术研究和写作领域&#xff0c;AI论文写作工具的出现极大地提高了写作效率和质量。这些工具不仅能够帮助研究人员快速生成论文草稿&#xff0c;还能进行内容优化、查重和排版等操作。以下是七款值得推荐的AI学术论文生成器&#xff0c;它们通过一键生成的方式&#xf…