从陌生到熟练使用string类

这篇具有很好参考价值的文章主要介绍了从陌生到熟练使用string类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

从陌生到熟练使用string类,C++,算法,c语言,c++,容器

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨
🐻推荐专栏1: 🍔🍟🌯C语言初阶
🐻推荐专栏2: 🍔🍟🌯C语言进阶
🔑个人信条: 🌵知行合一
🍉本篇简介:>:讲解C++中有关string类的使用,从构造函数到容量操作,到遍历以及增删查改和最后的运算符重载.

一、构造函数

string库的学习:传送门

在库中我们可以看到,string类的构造函数是很丰富的.

重点掌握牛牛框起来的四个哦,其他的忘记了咱可以查文档.
从陌生到熟练使用string类,C++,算法,c语言,c++,容器
构造函数使用演示:

void test1()
{
	//无参构造	string();
	string s1; 
	cout << "s1=  " << s1 << endl;
	
	//拷贝构造,	string (const string& str);
	s1 += "HELLO CSDN!!!";//下面讲,这里是为了s1里面有数据,方便拷贝构造
	string s2(s1);
	cout << "s2=  " << s2 << endl;

	//用另一个string类的字串初始化	string (const string& str, size_t pos, size_t len = npos);
	string s3(s1, 6,4);
	cout << "s3=  " << s3 << endl;

	//使用字符串进行初始化	string (const char* s);
	string s4("CJN Rush Rush Rush");
	cout << "s4=  " << s4 << endl;

	//string(const char* s, size_t n);
	string s5("CJN Rush Rush Rush",7);//不常用
	cout << "s5=  " << s5 << endl;

	//string(size_t n, char c);
	string s6(5, 'X');//不常用
	cout << "s6=  " << s6 << endl;	
}

运行结果:

s1=
s2= HELLO CSDN!!!
s3= CSDN
s4= CJN Rush Rush Rush
s5= CJN Rus
s6= XXXXX

从陌生到熟练使用string类,C++,算法,c语言,c++,容器

二、容量(capacity)相关的操作

我们看一下库中对capacity(容量)的相关操作有哪些.
从陌生到熟练使用string类,C++,算法,c语言,c++,容器

(1)size()和length()

其实size()length()并没有本质区别.
都是用于返回string中字符串的有效字符长度.
但是,由于string实现的比较早,当时设计的是length(),后来STL出来以后,为了统一,增加了size()接口.

	string s1;
	string s2("hello");
	//size和length并没有什么区别.
	cout << s1.size() << "  " << s1.length() << endl;
	cout << s2.size() << "  " << s2.length() << endl;

0 0
5 5

(2)resize()与reserve()

resize()用于改变字符串的有效字符长度.不够的地方用第二个参数填充.

	string s3("HELLO CSDN!!!");
	s3.resize(5);		//将字符串的有效字符长度改为5
	cout << s3 << endl;
	string s4("HELLO CSDN!!!");
	s4.resize(25,'x');	//将字符串的有效字符长度改为25,不够的地方用字符'x'填充
	cout << s4 << endl;

运行结果:

HELLO
HELLO CSDN!!!xxxxxxxxxxxx

resize()的改变会影响capacity(容量)吗?

	string s5("HELLO CSDN!!!");
	cout << "s5.capacity=" << s5.capacity() << endl;
	s5.resize(25, 'x');
	cout << "s5.capacity=" << s5.capacity() << endl;
	s5.resize(5, 'x');
	cout << "s5.capacity=" << s5.capacity() << endl;//并没有缩容

运行结果:

s5.capacity=15
s5.capacity=31
s5.capacity=31

当然,如果容量太小,不足以存储有效字符,必然是会扩容的!

扩容选择:(扩容方式是未定义的)
扩容是按有效字符长度扩容.
按之前容量的1.5倍扩容,更或者是2倍扩容.

reserve():请求改变容量的大小.

	string s6("HELLO CSDN!!!");
	cout << "s6.capacity=" << s6.capacity() << endl;
	s6.reserve(50);
	cout << "s6.capacity=" << s6.capacity() << endl;
	s6.reserve(30);
	cout << "s6.capacity=" << s6.capacity() << endl;//并没有缩容

	//一般都是不缩容的,缩容行为是未定义的.
	s6.clear();
	s6.reserve(0);
	cout << "s6.capacity=" << s6.capacity() << endl;//这里缩容了

s6.capacity=15
s6.capacity=63
s6.capacity=63
s6.capacity=15

是否缩容是未定义行为,取决于编译器,这里如果不清楚数据,直接将reserve(0),依旧不会缩容.

(3)clear()和empty()

	string s7;
	cout << s7.empty() << endl;
	s7 += "HELLO";
	cout << s7.empty() << endl;
	cout << "s7.size=" << s7.size() << endl;
	cout << "s7.capacity" << s7.capacity() << endl;
	s7.clear();
	cout << "s7.size=" << s7.size() << endl;
	cout << "s7.capacity" << s7.capacity() << endl;

运行结果:

1
0
s7.size=5
s7.capacity15
s7.size=0
s7.capacity15

显然clear只是清除有效字符,将字符清零,并不会影响capacity容量.

(4)小结:

  1. size()length()底层实现原理是一样的,都是返回有效的字符个数.只是为了STL的接口相统一.

  2. resize(size_t n)resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。
    注意:resize在改变元素个数时.
    (1)如果是将元素个数增多,可能会改变底层容量的大小,不然存储不了那么多有效字符.
    (2)如果是将元素个数减少,底层空间总大小不变

  3. reserve((size_t res_arg=0))函数是请求改变string的容量.
    (1)当res_arg大于当前的容量的时候,会进行扩容.
    (1)当res_arg小于当前的容量的时候,一般不会缩容.

  4. clear只是清除有效字符,将字符清零,并不会影响capacity容量.

三、访问与遍历

正向迭代器与反向迭代器:(这里对C++11的用法暂时不介绍)
从陌生到熟练使用string类,C++,算法,c语言,c++,容器

下标访问符 方括号[ ]重载
从陌生到熟练使用string类,C++,算法,c语言,c++,容器
示例:

void test3()
{
	string s1("This is a little boy");
	string::iterator it = s1.begin();	//s1.begin()会返回有效字符串中第个元素的位置
	while (it != s1.end())				//s1.end()会返回有效字符串最后一个元素的位置的后一个位置
	{
		cout << *it ;
		it++;
	}
	cout << endl;

	string::reverse_iterator rit = s1.rbegin();//反向迭代器
	while (rit != s1.rend())				//s1.end()会返回有效字符串最后一个元素的位置的后一个位置
	{
		cout << *rit;
		rit++;
	}
	cout << endl;

	cout << "s1.begin=" << *(s1.begin()) << endl;
	cout << "s1.end=" << *(s1.end()-1) << endl;		//不可直接访问s1.end(),因为不是有效字符,而是最后一个有效字符的下一个位置.
	cout << "s1.rbegin=" << *(s1.rbegin()) << endl;
	cout << "s1.rend=" << *(s1.rend()-1) << endl;	//这里为什么是+1而不是-1,留在后面的专门反向迭代器讲解

	//可以像数组一样用下标直接访问
	cout << s1[0] << endl;
	cout << s1[3] << endl;
	cout << s1[8] << endl;
}

四、增删改查

(1)追加字符/字符串(append)

从陌生到熟练使用string类,C++,算法,c语言,c++,容器

void test4()
{
	string s1("hello C");
	cout << "s1=" << s1 << endl;
	//尾插一个字符
	s1.push_back('S');
	s1.push_back('D');
	s1.push_back('N');
	cout << "s1=" << s1 << endl;
	cout << "----------------------------------" << endl;

	string s2("hello C");
	cout << "s2=" << s2 << endl;
	s2.append("SDN");		//追加字符串
	cout << "s2=" << s2 << endl;
	cout << "----------------------------------" << endl;

	string s3("hello C");
	cout << "s3=" << s3 << endl;
	s3 += "SDN";						//最喜欢使用这个,易读也简单
	cout << "s3=" << s3 << endl;
}

个人感想:
push_back一次插入一个字符太麻烦了,append虽然可以追加字符串,但是终究是没有+=来的香.

其它的以assign为例,一般用不到(因为实现的有些冗余,可以用别的函数代替),实在要用查库即可:

void test5()
{
	string str("This is a little boy");
	string s1,s2,s3;
	s1.assign(str);
	s2.assign(str, 8, string::npos);
	s3.assign(5, 'c');
	cout << "s1=" << s1 << endl;
	cout << "s2=" << s2 << endl;
	cout << "s3=" << s3 << endl;
}

运行结果:

s1=This is a little boy
s2=a little boy
s3=ccccc

(2)查找(find)/切割(substr)

从陌生到熟练使用string类,C++,算法,c语言,c++,容器

c_str:为了与C语言兼容,返回C形式的常量字符串.
find:可以查找目标字符/字符串.
string substr (size_t pos = 0, size_t len = npos) const:从pos往后len个字符,返回这段被切割的字符串的副本.

void test6()
{
	string s1("This is a little boy");
	const char* arr = s1.c_str();		//返回C形式的常量字符串
	cout << "arr=" << arr << endl;

	string s2("This is a little boy");

	cout << s2.find('i') << endl;		//查找目标字符
	cout << s2.find("little") << endl;	//查找目标字符串

	string s3("321xxxxxxx@qq.com");
	int pos1 = s3.find('@');
	int pos2 = s3.find(".com");
	string s4, s5, s6;
	s4 = s3.substr(0, pos1-1);			//从0位置开始,往后pos-1个字符
	s5 = s3.substr(pos1, s3.size() - pos2 - 1);
	s6 = s3.substr(pos2);				//第二个参数为往后的字符个数,不写,默认为npos

	cout << "s4= " << s4 << endl;
	cout << "s5= " << s5 << endl;
	cout << "s6= " << s6 << endl;
}

运行结果:

arr=This is a little boy
2
10
s4= 321xxxxxx
s5= @qq
s6= .com

五、运算符重载

小知识点:
npos是-1,只不过类型是const size_t,所以是整数的最大值,通常表示字符串的结尾或无效位置。npos定义在std命名空间中,通常用于字符串的查找操作。
从陌生到熟练使用string类,C++,算法,c语言,c++,容器

从陌生到熟练使用string类,C++,算法,c语言,c++,容器

从陌生到熟练使用string类,C++,算法,c语言,c++,容器

+运算符重载与getline()

void test7()
{
	string s1("HELLO ");
	string s2("CSDN");
	string s3;
	s3 = s1 + s2;		//因为是传值返回,所以效率不高,建议少用
	cout << s3 << endl;

	string name;
	cout << "Please, enter your full name: ";
	getline(cin, name);
	cout << "Hello, " << name << "!\n";

}

比较运算符这里就不一 一介绍了,字符串按ASCII码值进行比较.

从陌生到熟练使用string类,C++,算法,c语言,c++,容器

string类的使用还是需要多多练习,可以试着写一下相关的oj题练一下手,后续会模拟实现string类,加深对string类的理解.

string相关习题1

今天就讲到这里了,我们下次模拟实现见.
从陌生到熟练使用string类,C++,算法,c语言,c++,容器文章来源地址https://www.toymoban.com/news/detail-666416.html

到了这里,关于从陌生到熟练使用string类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】STL容器——string类的使用指南(含代码演示)(8)

    前言 大家好吖,欢迎来到 YY 滴C++系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁 主要内容含: 欢迎订阅 YY 滴C++专栏!更多干货持续更新!以下是传送门! YY的《C++》专栏 YY的《C++11》专栏 YY的《Linux》专栏 YY的《数据结构》专栏 YY的《C语言基础》专栏 YY的《初学者易

    2024年02月08日
    浏览(33)
  • ⌈算法进阶⌋图论::并查集——快速理解到熟练运用

    目录  一、原理 1. 初始化Init   2. 查询 find  3. 合并 union 二、代码模板 三、练习 1、  990.等式方程的可满足性🟢 2、  1061. 按字典序排列最小的等效字符串🟢 3、721.账户合并 🟡 4、  839.相似字符串组🟡 5、  2812.找出最安全路径 🔴 并查集主要运用与求一些 不相交且有关

    2024年02月13日
    浏览(26)
  • ⌈算法进阶⌋图论::拓扑排序(Topological Sorting)——快速理解到熟练运用

    目录  一、原理 1. 引例:207.课程表  2. 应用场景 3. 代码思路 二、代码模板 三、练习 1、210.课程表Ⅱ🟢 2、2392.给定条件下构造举证🟡 3、310.最小高度树🟡 4、 2603.收集树中金币 🔴 1. 引例:207.课程表 就如大学课程安排一样,如果要学习数据结构与算法、机器学习这类课程

    2024年02月11日
    浏览(30)
  • 基于C语言的数据结构之顺序表——带你熟练掌握顺序表基本操作!!超级详细!!

    目录 前言: 1.源代码如下 2.数据结构——顺序表    2.1.顺序表的特点    2.2顺序表的分类     2.2.1.动态分配内存的顺序表     2.2.2.静态分配内存的顺序表    2.3.定义一个顺序表 3.顺序表的基本操作    3.1初始化顺序表     不用将顺序表中可能存在的原有元素初始化吗?

    2024年04月26日
    浏览(31)
  • STL常用容器—string容器

    本质: string是C++风格的字符串,而string本质上是一个类 string和char * 区别: char * 是一个指针 string是一个类,类内部封装了char *,管理这个字符串,是一个char *型的容器。 特点: string 类内部封装了很多成员属性和方法 string管理char*所分配的内存,不用担心复制越界和取值越

    2024年01月16日
    浏览(31)
  • 如何熟练使用vim工具?

    🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏1: 🍔🍟🌯C语言初阶 🐻推荐专栏2: 🍔🍟🌯C语言进阶 🔑个人信条: 🌵知行合一 🍉本篇简介::讲解C++中的函数重载、引用、auto、内联函数等. 金句分享: ✨生活本就沉默,但是跑起来有风!✨ 文末有彩蛋哦! Vim 是一款文

    2024年02月05日
    浏览(23)
  • 带你熟练使用list

    🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻强烈推荐优质专栏: 🍔🍟🌯C++的世界(持续更新中) 🐻推荐专栏1: 🍔🍟🌯C语言初阶 🐻推荐专栏2: 🍔🍟🌯C语言进阶 🔑个人信条: 🌵知行合一 🍉本篇简介::讲解C++中STL中 list 简单使用. 官方查询文档 本文的目的主要是介绍 list 的

    2024年02月07日
    浏览(27)
  • 熟练使用git之git撤回操作

    需要关注持续更新的朋友可以关注下面的链接: git操作合集地址 1、执行了merge但没有commit 2、撤回上次或者上上次提交代码 要撤销上一次提交或上上次提交的代码,有两种常用的方法可以实现: 2.1. 使用 git revert 撤销提交: 撤销上一次提交: git revert HEAD 撤销上上次提交:

    2024年02月12日
    浏览(36)
  • C++提高编程——STL:string容器、vector容器

    本专栏记录C++学习过程包括C++基础以及数据结构和算法,其中第一部分计划时间一个月,主要跟着黑马视频教程,学习路线如下, 不定时更新,欢迎关注 。 当前章节处于: ---------第1阶段-C++基础入门 ---------第2阶段实战-通讯录管理系统, ---------第3阶段-C++核心编程, -----

    2024年01月23日
    浏览(35)
  • C++ 学习之string容器

    在C++中,标准库中的 std::string 类提供了多种构造函数,可以用于不同情况下对字符串进行初始化和构造。以下是 std::string 类常见的构造函数及其使用情况: 默认构造函数: 用于创建一个空字符串对象。 带参数的构造函数: 用于通过字符串字面值或者C风格的字符串初始化字

    2024年02月20日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包