当前位置: 首页 > news >正文

C++初阶——string的使用(上)

C++初阶——string的使用(上)

一、STL简介

1.什么是STL

STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构算法的软件框架。

2.STL的六大组件

在这里插入图片描述

二、String

1.什么是string

  1. string是表示字符串的字符串类
  2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作

我们来看一下cplusplus网站给出的英文定义:
链接: link
示例1
示例2
示例3
这里详细介绍了string有哪些成员变量,哪些成员函数,以及成员常量和非成员函数重载……在本期内容中,我们聚焦于string类的使用,后面会详细讲解string的模拟实现,在探索底层奥妙的同时也能复习一下前面学过的内容。

2.string的使用介绍

(1)string类的实例化(构造函数、拷贝构造函数)

我们来看这一段代码:
示例4
和我们之前学过的内容一样,string是一个管理字符串的类,它是一个图纸,需要我们先进行实例化,在实例化的过程中,会调用string的构造函数,对于构造函数,分为需要传参的构造函数以及默认构造函数(无参的,全缺省的,我们不写编译器自动生成的),点击链接网站的constructor,查看string构造函数
示例5

  • 不难看出,这里的构造函数有很多种,可以满足各种各样的传参模式。这里实例化的s1就是调用的第一个构造函数;s2s3调用的是第四个构造函数,传一个字符串;s4调用的是第6个,用10个字符‘*’初始化一个字符串;至于s5就有些不同了,这里是一个拷贝构造,调用的是第2个——拷贝构造函数(形参是对一个类对象的引用)
  • s1赋值给s2,这里用到了运算符重载,包括后面的<<==><,当然还有++=之类的,这里我们先不详细介绍
  • 对于s6的示例化采用的是第三个构造函数,string (const string& str, size_t pos, size_t len = npos);意思是s6是由s3取从第五6个位置开始,往后5个字符来初始化,pos就是字符串中字符的位置,从0开始,len就是选取的字符串的长度,那么这里为什么提供一个缺省参数呢?如果我们不指定长度,它会一直取到结尾;npos是什么?我们来看一下:
    示例6
    npos是一个无符号整型,当它为-1,对应的就是整型的最大值。这里的s7就是如此,而s8传了具体长度,但是超过了s3的长度,也是自动取到s3的结尾为止。
  • 至于最后的s1="11111";,左边是一个类对象,右边是一个字符串,它们的类型不同,因此这里涉及到隐式类型转换的问题
  • 运行结果如图:示例7
(2)string的运算符重载

刚才已经提到了<<><==的运算符重载,我们接着探究:
示例8
这里的+=就是在字符串的尾部插入数据,string的运算符重载也非常简单,根据运算符本身的意思就可以理解。

(3)常用成员函数size、begin、end,迭代器iterator,常用遍历方法

示例9

  • 我们先实例化一个对象s1,通过对象访问函数size,得到的是字符串的长度,使用for循环进行遍历:
    示例10
    Returns the length of the string, in terms of bytes.
  • 迭代器:迭代器是STL六大组件之一,非常重要,这里的迭代器我们可以理解为指针,用来遍历字符串,这里的迭代器先指向的字符串的首个位置,用begin进行获取,在循环的过程中不断++,向后移动,和指针的操作一样,到结尾为止,使用end函数获取字符串的末位置:
    示例11
    示例12
  • 当然,这里还可以使用范围for进行遍历,auto关键字可以自动识别类型,对于一些类型较为复杂的迭代器,使用auto更为方便,比如说这里的vectorlist,至于vector和list,后面会详细讲解。
  • reverse是颠倒顺序,属于算法库,需要包含头文件<algorithm>,同样的sort是排序,也属于算法库,这里稍微使用一下,感受感受。
  • 运行结果如图:
    示例13
(4)const迭代器const_iterator、反向迭代器reverse_iterator、配套使用rbegin,rend

示例代码:
示例14

  • 这里使用了反向迭代器reverse_iterator,也就是说这里是倒过来遍历字符串,所以开始的位置就是字符串的尾部,配套的找尾使用rbegin,结束是rend,至于这里为什么使用auto自动判断类型,是因为从string类中取出反向迭代器的代码比较长,不方便,这里就体现了auto关键字的重要作用。
    示例15
    示例16
  • 至于const迭代器,也是很好理解的,当我们不想修改内容时,就使用const_iterator
  • 运行结果如图:
    示例17
(5)字符串的插入删除处理(push_back、append、insert、assign、erase)

代码如下:
示例18

  • push_back是向字符串的末尾插入字符,使用说明如下:
    示例19
  • append是在字符串的末尾加上一个字符串,使用方法如图所示:
    示例20
    其中包括在一个字符串后添加一个string类,指定截取某一段位置,或者添加字符串常量,指定需要的长度,或者添加某个字符,指定所需个数,使用方法简单明了。
  • assign的用法也很简单,就是用新的内容替换以前的内容。
    示例21
  • inserterase是我们熟悉的,可以在指定位置插入和删除字符,使用介绍如下:
    示例22
    示例23

三、本期代码资源

#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<algorithm>
using namespace std;//int main()
//{
//	string s1;
//	string s2("张三");
//	string s3("hello world");
//	string s4(10, '*');
//	string s5(s2);
//	s1 = s2;
//	cout << s1 << endl;
//	cout << s2 << endl;
//	cout << s3 << endl;
//	cout << s4 << endl;
//	cout << s5 << endl;
//
//	string s6(s3, 6, 5);
//	cout << s3 << endl;
//	cout << s6 << endl;
//
//	cout << (s1 == s2) << endl;
//	cout << (s1 > s2) << endl;
//
//	string s7(s3, 6);
//	cout << s7 << endl;
//
//	string s8(s3, 6, 100);
//	cout << s8 << endl;
//		
//	string url("https://en.cppreference.com/w/");
//	string sub1(url, 0, 5);
//	string sub2(url, 8, 13);
//	string sub3(url, 22);
//	cout << sub1 << endl;
//	cout << sub2 << endl;
//	cout << sub3 << endl;
//
//	s1 = "1111";
//	cout << s1 << endl;
//
//	s1 = '2';
//	cout << s1 << endl;
//
//	return 0;
//}//class string
//{
//public:
//	string operator+=(char ch);
//	string operator+=(const char* str);
//private:
//	char* _str;
//	size_t _size;
//	size_t _capacity;
//};//int main()
//{	
//	string s1("hello");
//	s1 += ' ';
//	s1 += "world";
//	cout << s1 << endl;
//
//	size_t x = 0;
//	cin >> x;
//	string xstr;
//	while (x)
//	{
//		size_t val = x % 10;
//		xstr += ('0' + val);
//		x /= 10;
//	}
//	cout << xstr << endl;
//		
//	return 0;
//}//int main()
//{
//	string s0;
//	string s1("hello world");
//	cout << s1 << endl;
//	cout << s1.size() << endl;
//
//	size_t i = 0;
//	for (i = 0; i < s1.size();i++)
//	{
//		s1[i]++;
//	}
//	cout << s1 << endl;
//
//	s1[0]--;
//	for (i = 0; i < s1.size(); i++)
//	{
//		cout << s1[i] << " ";
//	}
//	cout << endl;
//
//	//char s3[] = "hello world";
//	//s3[1]++; //-> *(s3+1)
//	//s1[1]++; //s1.operator[](1);
//
//	//迭代器
//	string::iterator it = s1.begin();
//	while (it != s1.end())
//	{
//		(*it)--;
//		it++;
//	}
//	cout << s1 << endl;
//
//	it = s1.begin();
//	while (it != s1.end())
//	{
//		cout << (*it) << " ";
//		it++;
//	}
//	cout << endl;
//
//	for (char ch : s1)
//	{
//		cout << ch << " ";
//	}
//	cout << endl;
//
//	vector<int> v;
//	v.push_back(1);
//	v.push_back(2);
//	v.push_back(3);
//	v.push_back(4);
//	v.push_back(5);
//	vector<int>::iterator vit = v.begin();
//	while (vit != v.end())
//	{
//		cout << *vit << " ";
//		vit++;
//	}
//	cout << endl;
//
//	list<int> lt;
//	lt.push_back(10);
//	lt.push_back(20);
//	lt.push_back(30);
//	lt.push_back(40);
//	lt.push_back(50);
//
//	list<int>::iterator lit = lt.begin();
//	while (lit != lt.end())
//	{
//		cout << *lit << " ";
//		lit++;
//	}
//	cout << endl;
//
//	reverse(v.begin(), v.end());
//	reverse(lt.begin(), lt.end());
//
//	for (auto e : v)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//
//	for (auto e : lt)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//
//	sort(v.begin(), v.end());
//	for (auto e : v)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//
//	return 0;
//}//void Func(const string& s)
//{
//	string::const_iterator it = s.begin();
//	while (it != s.end())
//	{
//		cout << *it << " ";
//		it++;
//	}
//	cout << endl;
//	auto rit = s.rbegin();
//	while (rit != s.rend())
//	{
//		cout << *rit << " ";
//		rit++;
//	}
//	cout << endl;
//}
//
//int main()
//{
//	string s1("hello world");
//	//string::reverse_iterator rit = s1.rbegin();
//	auto rit = s1.rbegin();
//	while (rit != s1.rend())
//	{
//		(*rit) += 3;
//		cout << *rit << " ";
//		rit++;
//	}
//	cout << endl;
//	Func(s1);
//
//	return 0;
//}//int main()
//{	
//	string s1("hello world");
//
//	s1.push_back('!');
//	cout << s1 << endl;
//
//	s1.append("ssssss");
//	cout << s1 << endl;
//	
//	s1.assign("111111111");
//	cout << s1 << endl;
//
//	s1.insert(0, "hello");
//	cout << s1 << endl;
//
//	s1.insert(5, "world");
//	cout << s1 << endl;
//
//	s1.insert(0, 10, 'x');
//	cout << s1 << endl;
//
//	s1.insert(s1.begin()+10, 10, 'y');
//	cout << s1 << endl;
//
//	s1.erase(5, 6);
//	cout << s1 << endl;
//
//	return 0;
//}

本期总结+下期预告

本期内容介绍了STL——标准模板库,以及String的使用方法,String的使用内容还有很多,下期内容将结合之前写过的顺序表,继续介绍String的内存管理以及其他成员函数!

感谢大家的关注,我们下期再见!
在这里插入图片描述

相关文章:

  • 词语关系图谱模型
  • QGIS实用功能:加载天地图与下载指定区域遥感影像
  • Python实例题:Python3OpenCV视频转字符动画
  • [Java · 铢积寸累] 基础函数 — 生成随机数 - Math.random() 详解
  • G1 人形机器人硬件构成与接口
  • AI算子开发是什么
  • Agent系统工程实践:Langchain-Chatchat框架定制与优化
  • PostgreSQL认证培训推荐机构
  • 关于el-table可展开行实现懒加载的方案
  • ​​电商系统用户需求报告(示例)
  • Java基础复习(JavaSE进阶)第六章 IO流体系
  • 语音合成(TTS)从零搭建一个完整的TTS系统-第二节-中文转拼音
  • 【Python Web开发】01-Socket网络编程01
  • 【Python爬虫基础篇】--3.cookie和session
  • 乐视系列玩机---乐视1s x500 x501 x502等系列线刷救砖以及刷写第三方twrp 卡刷第三方固件步骤解析
  • 现有一整型数组,a[8] = { 4,8,7,0,3,5,9,1},现使用堆排序的方式原地对该数组进行升序排列。那么在进行第一轮排序结束之后,数组的顺序为?
  • 【HTML】【Web开发】滑动条挑战
  • Docker的基本概念和一些运用场景
  • Linux[基础指令][2]
  • Vue3 + Vite + TS,使用 ExcelJS导出excel文档,生成水印,添加背景水印,dom转图片,插入图片,全部代码
  • 贵州省交通运输厅原副厅长冯伟已任遵义市领导
  • 神二十瞄准明日17时17分发射
  • 开发国内首个泌尿专科智能体,医生们将临床经验转变为知识图谱
  • 河南省濮阳市委常委、组织部部长刘建茂接受审查和调查
  • 一条水脉串起七个特色区块,上海嘉定发布2025年新城行动方案
  • 中共中央、国务院印发《关于实施自由贸易试验区提升战略的意见》