string类的函数讲解

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

标准库中的string类

首先关于string类的了解,我先给出官方的string类的讲解,以便于大家的学习:链接: http://www.cplusplus.com/reference/string/string/?kw=string
这个网站是C++官方网站,里面对于各个关键字和库函数的讲解都是很官方的,大家有需要的时候可以参考

我们对string类进行一个简单的总结:

  1. string是表示字符串的字符串类
  2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
  3. string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator> string;
  4. 不能操作多字节或者变长字符的序列。

这里有一个需要注意的点:
在使用string类时,必须包含#include头文件以及using namespace std;

下面我们就对string类的一些常用的接口进行讲解:

string类的常用接口说明
string类对象的常见构造

string类的函数讲解,c++,开发语言
首先我们看看创建一个空的string类,就是一个空的字符串:

#include<iostream>
using namespace std;
int main()
{
	string s1;
	cout << s1 << endl;
	return 0;
}

输出为空:
string类的函数讲解,c++,开发语言
构造string类对象:

#include<iostream>
using namespace std;
int main()
{
	string s1("hello world");
	cout << s1 << endl;
	return 0;
}

string类的函数讲解,c++,开发语言
拷贝构造:

#include<iostream>
using namespace std;
int main()
{
	string s1("hello world");
	cout << s1 << endl;
	string s2(s1);
	cout << s2 << endl;
	return 0;
}

string类的函数讲解,c++,开发语言
将n个字符放入一个string类中:

#include<iostream>
using namespace std;
int main()
{
	string s1(5,'a');
	cout << s1 << endl;
	return 0;
}

string类的函数讲解,c++,开发语言
去一个string类中的字符存入另一个string类:
例如,将s1中第六个字符开始往后取三个字符放入s2
这里注意:
如果这里的要取字符的数量大于字符串的字符个数的话,能取多少取多少

#include<iostream>
using namespace std;
int main()
{
	string s1("hello world");
	cout << s1 << endl;
	string s2(s1, 6, 3);
	cout << s2 << endl;
	return 0;
}

string类的函数讲解,c++,开发语言

string类对象的容量操作

string类的函数讲解,c++,开发语言
我们这里的size和lenth的作用是一样的,只是在后期的语言发展中为了适应需要,例如,如果是一个二叉树,用lenth合适吗,所以就引出了size
注意,这里计算出来的是有效字符个数,也就是说不包括’\0’

用法如下:

#include<iostream>
using namespace std;
int main()
{
	string s1("hello world");
	cout << s1.length() << endl;
	cout << s1.size() << endl;
	return 0;
}

string类的函数讲解,c++,开发语言
capacity是返回空间的大小:
至于容量为什么是15,这就是底层实现的原因了,一些编译器是基于1.5倍的扩容,比如我们的vscode,而linux的终端里是以2倍的扩容,其实不必太过于纠结这一点,我们只需要了解到这一点即可
但是各自的容量起点也不一样!

#include<iostream>
using namespace std;
int main()
{
	string s1("hello world");
	cout << s1.capacity() << endl;
	return 0;
}

string类的函数讲解,c++,开发语言
empty函数的用法很简单:
例如,不为空返回0

#include<iostream>
using namespace std;
int main()
{
	string s1("hello world");
	cout << s1.capacity() << endl;
	cout << s1.empty() << endl;
	return 0;
}

string类的函数讲解,c++,开发语言
clear的作用就是清空字符串:
清理之后输出空行,字符串被清空

#include<iostream>
using namespace std;
int main()
{
	string s1("hello world");
	cout << s1 << endl;
	s1.clear();
	cout << s1 << endl;
	return 0;
}

string类的函数讲解,c++,开发语言
这里有一个重点内容:
reserve和resize的区别
其实二者都是用来提前开空间的,因为扩容会影响程序的效率
例如:
可以看到二者都成功地开辟了空间
string类的函数讲解,c++,开发语言
string类的函数讲解,c++,开发语言
并且使用resize时还可以填充多余的空间:
string类的函数讲解,c++,开发语言
但其实这不是重点,重点在于:
这是resize:

#include<iostream>
using namespace std;
int main()
{
	string s1("hello world");
	cout << s1.capacity() << endl;
	cout << s1.size() << endl;
	s1.resize(30);
	cout << s1.capacity() << endl;
	cout << s1.size() << endl;
	return 0;
}

string类的函数讲解,c++,开发语言

这是reserve:

#include<iostream>
using namespace std;
int main()
{
	string s1("hello world");
	cout << s1.capacity() << endl;
	cout << s1.size() << endl;
	s1.reserve(30);
	cout << s1.capacity() << endl;
	cout << s1.size() << endl;
	return 0;
}

string类的函数讲解,c++,开发语言
大家可以发现:
用reserve来提前开辟空间,capacity改变,size不变,而用resize则是capacity和size都会发生改变!

下面给大家一个小的总结:

注意:

  1. size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一
    致,一般情况下基本都是用size()。
  2. clear()只是将string中有效字符清空,不改变底层空间大小。
  3. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。
  4. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于
    string的底层空间总大小时,reserver不会改变容量大小。
string类对象的访问及遍历操作

string类的函数讲解,c++,开发语言
operator[],就是返回该位置的字符,其实就是用于循环:
但是要注意一点,如果访问越界,就会直接报错,导致程序终止
并且该函数一般只适用于数组结构

#include<iostream>
using namespace std;
int main()
{
	string const s1("hello world");
	for (int i = 0; i < s1.length(); i++)
	{
		cout << s1[i];
	}
	cout << endl;
	return 0;
}

string类的函数讲解,c++,开发语言
迭代器:
迭代器有两种,还有一个叫做反向迭代器,就是从尾部开始遍历
在这里我们暂且把begin认为是指针来理解
我们使用正向的迭代器的时候要引出string类里面的iterator
begin就默认是从零开始输出记得用解引用,指针向后移动

我们给出一张对比图:
string类的函数讲解,c++,开发语言

#include<iostream>
using namespace std;
int main()
{
	string s1("hello world");
	for (string::iterator i = s1.begin(); i != s1.end(); i++)
	{
		cout << *i;
	}
	return 0;
}

string类的函数讲解,c++,开发语言
而反向迭代器就是从后开始往前移动:
这里要引出的是 reverse_iterator 其实这里的rbegin已经不在字符串的第一个位置了二者是有区别的,并且,这里的指针也是++,不然怎么会叫做反向迭代器呢?

#include<iostream>
using namespace std;
int main()
{
	string s1("hello world");
	for (string::reverse_iterator i = s1.rbegin(); i != s1.rend(); i++)
	{
		cout << *i;
	}
	return 0;
}

string类的函数讲解,c++,开发语言
另外大家记住一个点:
for循环的底层实现就是迭代器!

string类对象的修改操作

string类的函数讲解,c++,开发语言
尾插字符:
尾插很简单

#include<iostream>
using namespace std;
int main()
{
	string s1("hello world");
	s1.push_back('!');
	cout << s1 << endl;
	return 0;
}

string类的函数讲解,c++,开发语言
追加字符串:
相比较push_back,append只能追加字符串,而前者只能追加字符

#include<iostream>
using namespace std;
int main()
{
	string s1("hello world");
	s1.append(" hhhh!");
	cout << s1 << endl;
	return 0;
}

string类的函数讲解,c++,开发语言
但是operator+=能够把上面两个函数一起实现,并且函数的可读性更高,所以我们一般选择使用+=来实现对对象的追加:

#include<iostream>
using namespace std;
int main()
{
	string s1("hello world");
	s1+=(" hhhh!");
	cout << s1 << endl;
	s1 += ('x');
	cout << s1 << endl;
	return 0;
}

string类的函数讲解,c++,开发语言
返回C字符串:

#include<iostream>
using namespace std;
int main()
{
	string s1("hello world");
	cout << s1.c_str() << endl;
	return 0;
}

string类的函数讲解,c++,开发语言
返回字符串中的位置:
返回位置既可以从前往后找又可以从后往前找
find是从前往后,rfind是从后往前,npos是字符串的长度
string类的函数讲解,c++,开发语言
string类的函数讲解,c++,开发语言
如果找不到的话这里的npos是-1
但是find函数返回的是无符号整形,所以-1进行了转换
string类的函数讲解,c++,开发语言
截取字符:
从pos位置开始往后截取n个字符
如果n大于length-pos,能截取多少就截取多少

#include<iostream>
using namespace std;
int main()
{
	string s1("hello world");
	cout << s1.substr(3, 4) << endl;
	cout << s1.substr(3, 12) << endl;
}

string类的函数讲解,c++,开发语言

下面我们对于string类的修改操作做一个小总结:

  1. 在string尾部追加字符时,s.push_back© / s.append(1, c) / s += 'c’三种的实现方式差不多,一般情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。
  2. 对string操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留好。
string类非成员函数

string类的函数讲解,c++,开发语言
其实这里用的不多,不做过多的讲解
但是这个getline函数是可以用到一些题目中来读取字符串的,他遇到换行符就会停止读取,遇到空格不会:

int main()
{
	std::string name;

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

	return 0;
}

string类的函数讲解,c++,开发语言
好了,今天的分享到这里就结束了,谢谢大家的支持!文章来源地址https://www.toymoban.com/news/detail-770108.html

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

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

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

相关文章

  • 复习第七课 C语言-指针数组,函数,string

    目录 【1】指针和数组 【2】数组指针 【3】指针数组 【4】函数 【5】函数传参 【6】动态开辟堆区空间 【7】string函数族 【8】递归函数 练习: 直接访问:通过数组名访问 间接访问:通过指针访问 》1. 一维数组 运算方法: 1) *和++都是弹幕运算符,优先级相同 2) 单目运算

    2024年02月16日
    浏览(28)
  • C语言string.h函数详解及部分模拟实现

    string.h是一个C标准库头文件,包含了字符串处理函数、字符分类函数、数值转换函数、内存管理函数等操作字符串的函数。 查询:string.h头文件 功能: strlen函数用于求字符串长度 strlen函数 以’\\0’ 作为结束标志 ,返回的是 在字符串中 ‘\\0’ 前面出现的字符个数(不包含

    2024年02月03日
    浏览(24)
  • String 类的基本用法及String 类的常见操作

    作者:月亮嚼成星~ 博客主页:月亮嚼成星~的博客主页 专栏:Java SE基础 工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网 点击免费注册和我一起刷题吧 总结: 构造字符串的三种方式: 1)使用常量串 2)直接使用new String对象 3)利用字符数组 St

    2024年02月02日
    浏览(33)
  • 详解C语言string.h中常用的14个库函数(四)

    本篇博客会讲解最后4个函数,分别是memset, memcpy, memmove, memcmp。这4个函数开头都是mem,即memory(内存)的缩写。 memset可以用来设置内存中的值。该函数可以把从ptr指向的空间开始,后面的num个字节设置成value的值。 举个简单的例子。假设有一个数组: 我们想把这个数组的前

    2023年04月24日
    浏览(26)
  • 【C语言】函数讲解(下)

    所属专栏:C语言 博主首页:初阳785 代码托管:chuyang785 感谢大家的支持,您的点赞和关注是对我最大的支持!!! 博主也会更加的努力,创作出更优质的博文!! 关注我,关注我,关注我,重要的事情说三遍!!!!!!!! 告诉编译器有一个函数叫什么,参数是什么,

    2024年02月02日
    浏览(25)
  • 《string类的使用介绍》

    本文主要介绍string的常见的接口的使用 字符串是 表示字符序列的类 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。 string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器

    2024年02月03日
    浏览(31)
  • string类的模拟实现

    上一篇博客我们对string类函数进行了讲解,今天我们就对string类进行模拟实现,以便于大家更加深入地了解string类函数的应用 由于C++的库里面本身就有一个string类,所以我们为了不让编译器混淆视听,我们可以首先将我们自己模拟实现的string类放入一个我们自己定义的命名空

    2024年01月21日
    浏览(26)
  • String 类的运用

    目录 1.字符串构造  2.String对象的比较 2.1==比较是否引用同一个对象 2. 2boolean equals(Object anObject) 2.3int compareTo(String s) 方法: 按照字典序进行比较 2.4int compareToIgnoreCase(String str)  3.字符串查找  4.2大小写转换 4.3字符串转数组  4.4 格式化 5.字符串替换 5.1把字符串中的某个字符替

    2024年02月13日
    浏览(27)
  • 【c++】string类的使用

    目录 一、标准库中的string类 1、简单介绍string类 2、string类的常用接口注意事项 2.1、string类对象的常用构造 2.2、string类对象的容量操作 2.3、string类对象的访问及遍历操作 2.4、string类对象的修改操作 二、string类的模拟实现         (1)string是表示字符串的字符串类;    

    2024年02月01日
    浏览(62)
  • 【C++】string类的模拟实现

    前言:在上一篇中我们讲到了string类的使用方法,今天我们将进一步的去学习string类,去底层看看它顺带模拟实现部分的内容。 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 专栏分类:高质量C++学习 👈 💯代码仓库:卫卫周大胖的学习日记💫 💪关注博主和博主一起学习!一起努

    2024年03月21日
    浏览(30)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包