【C++】对于string的学习

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

前言

本篇文章针对C++中的string做一些详细的介绍和学习,并且会包含一些关于STL的介绍
注意:
本篇文章只包含基础知识

STL

STL是标准模板库的一个缩写,全称是Standard Template Library

string

C++中定义了一种类,为string,存放在头文件<string>中

存放C语言风格字符串的头文件是<cstring>,也就是以’\0’为结尾的字符数组

C语言的字符串的对比与string

指针与类

char*是指针,而string是一个类

在string中封装了char*,管理这个字符串,是一个char*类型的容器

功能的多少

string封装了很多实用的成员方法
比如:查找find、拷贝copy、删除erase、替换replace、插入insert

不用考虑内存释放和越界

string管理char*对所分配的内存,每一次string的复制/赋值,取值都由string类负责维护,不用担心复制越界和取值越界等问题。

API

API是应用程序接口(Application Programming
Interface),是STL提供给用户使用的接口,一般表现为公共成员函数和重载操作符

string的十个API(功能)

构造

下面介绍构造的四种用法

string();
//默认构造函数,作用是创建一个空的字符串

string(const string& str);
//拷贝构造函数,使用一个string对象初始化另一个string对象

string(const char* s);
//含参构造函数,使用C语言风格字符串初始化

string(int n, char c);
//含参构造函数,使用n个字符C初始化

赋值

重载赋值操作符=
string& operator=(const char* s);
//C风格的字符串赋值给当前的字符串

string& operator= (const string& s);
//把字符串s赋给当前的字符串

string& operator=(const char c);
//字符串赋值给当前的字符串

成员函数assign
string& assign(const char* s);
//C风格字符串赋值给当前的字符串

string& assign(const char* s.int n);
//把C风格的字符串s的前n个字符赋给当前的字符串

string& assign(const string& s);
//把字符串s赋给当前字符串

string& assign(int n, char c);
//把n个字符c赋给当前的字符串

string& assign(const string& s, int start, int n);
//将字符串s中从start开始的n个字符赋值给当前的字符串

存取

string& assign(const char* s);
//C风格字符串赋值给当前的字符串

string& assign(const char* s.int n);
//把C风格的字符串s的前n个字符赋给当前的字符串

string& assign(const string& s);
//把字符串s赋给当前字符串

string& assign(int n, char c);
//把n个字符c赋给当前的字符串

string& assign(const string& s, int start, int n);
//将字符串s中从start开始的n个字符赋值给当前的字符串

重载下表获取操作符[]

char& operator[](int n);
//通过[]以访问下标的方式获取字符

注意:
当使用下标操作符获取字符时,如果下标越界,程序将会强制终止

成员函数at

char& at(int n);
//通过at方式获取字符

注意:
使用at方法获取字符时,如果下标越界,at方法内部会抛出异常,可以使用try-catch捕获并处理该异常
需要包含头文件<stdexception>

拼接

重载复合操作符+=

string & operator+=const string% str);
//将字符串str追加到当前字符串末尾

string& operator+=(const char* str);
//将C风格字符数组追加到当前字符串末尾

string& operator+=(const char c);
//将字符c追加到当前字符串末尾

成员函数append

string& append(const char* s);
//把C风格字符数组s连接到当前字符串结尾

string& append(const char* s, int n);
//把C风格字符数组s的前n个字符连接到当前字符串结尾

string& append(const string& s);
//将字符串s追加到当前字符串末尾

string& append(const string& s, int pos, int n);
//把字符串s中从pos开始的n个字符连接到当前字符串结尾

string% append(int n, char c);
//在当前字符串结尾添加n个字符c

查找

成员函数find

int find(const string& str, int pos = 0)const;
//查找str在当前字符串中第一次出现的位置,从pos开始查找,pos默认为0

int find(const char* s, int n = 0)const;
//查找C风格字符串s在当前字符串中第一次出现的位置,从pos开始查找,pos默认为0

详细解释:
当查找失败时,find方法返回 - 1, - 1已经被封装为string的静态成员常量string::npos
static const size_t npos = -1;
find方法通常查找字符串第一次出现的位置,而rfind2方法通常查找字符串最后一次出现的位置

成员函数rfind

这里可以联系上面的find函数帮助理解

int rfind(const string& str, int pos = npos)const;
//从pos开始向左查找最后一次出现的位置,pos默认是npos

int rfind(const char* s, int pos = npos)const;
//查找s最后一次出现的位置,从pos开始向左查找,pos默认为npos

int rfind(const char* s, int pos, int n)const;
//从pos开始想做查找s的前n个 字符最后一次出现的位置

int rfind(const char c, int pos = npos)const;
//查找字符c最后一次出现的位置

注意:
rfind(str, pos)的实际的开始位置是pos + str.size(),即从该位置开始(不包含该位置字符)向前寻找匹配项,
如果有则返回字符串位置,如果没有则返回string::npos

关于string::npos
我们都知道 - 1 是size_t类的最大值,
所以string::npos其实就表示“直到字符串结束”,这样就可以理解rfind中pos的默认参数是npos了

同时,我们也可以发现string::npos和container.end()迭代器(没学过)其实是相同含义的,说明我们STL各个模块的设计是统一的

替换

成员函数replace

string & replace(int pos, int n, const string & str);
//替换从pos开始n个字符为字符串s

string& replace(int pos, int n, const char* s);
//替换从pos开始的n个字符为字符串s

string& replace(int pos, int n, const char* s);
//替换从pos开始的n个字符为字符串s

成员函数compare

int compare(const string& s)constl
//与字符串s比较

int compare(const char* s)const;
//与C风格字符数组比较

注意:
compare函数依据字典序(即字母顺序)进行比较
当当前字符串小于给定字符串时,返回 - 1、当当前字符串比给定字符串大时,返回1、相等返回0

重载比较操作符

有 > < >= <= == !=

子串

成员函数substr

string substr(int pos = 0; int n = npos)const;
//返回由pos开始的n个字符组成的字符串

解释:

string::npos的含义是截取到整个字符串结束

插入

成员函数insert

string& insert(int pos, const char* s);
//在pos位置插入C风格字符数组

string& insert(int pos, const string& str);
//在pos位置插入字符串str

string& insert(int pos, int n, char c);
//在pos位置插入n个字符c

删除

成员函数erase

string& erase(int pos, int n = npos);
//删除从pos位置开始的n个字符

解释:

string::npos的含义是截取到整个字符串结束

结语

本篇文章只介绍了string的使用知识
至于相关的例题,则会在之后其他的专栏里记录和总结文章来源地址https://www.toymoban.com/news/detail-684255.html

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

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

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

相关文章

  • Java核心知识点1-java和c++区别、隐式和显示类型转换

    java和c++区别 java通过虚拟机实现跨平台特性,但c++依赖于特定的平台。 java没有指针,它的引用可以理解为安全指针,而c++和c一样具有指针。 java支持自动垃圾回收,而c++需要手动回收。 java不支持多重继承,只能通过实现多个接口来达到相同目的,而c++支持多继承。  隐式(

    2024年02月03日
    浏览(35)
  • 【C++】如果你准备学习C++,并且有C语言的基础,我希望你能简单的过一遍知识点。

    相关视频——黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难_哔哩哔哩_bilibili(1-83) 我的小站——半生瓜のblog 我知道这个视频早已经被很多人学习并且记录笔记,但是我还是想再过一遍前面的基础知识点,所以我这个笔记会非常的简洁,适合有C语言基础的小伙

    2024年02月01日
    浏览(39)
  • C++碎知识点

    二叉树 由 n个节点构成的形态不同的⼆叉树 同余符号 定义设m是大于1的正整数,a,b是整数,如果m|(a-b),则称a与b关于模m同余,记作abmod(m),读作a同余于b模m。 符号= 按位与 后赋值 C语言中计算优先级 1LL 1LL会在运算时把后面的临时数据扩容成long long类型,再在赋值给左边时转

    2024年02月12日
    浏览(35)
  • C++知识点 -- 智能指针

    对于上面的场景,p1和p2在new申请空间后,div函数如果出现了除0错误,那么程序就会抛出异常,跳到接受异常的程序段继续执行,p1和p2申请的空间就没有被正常释放,造成了内存泄漏; 这种场景我们就可以使用智能指针来解决空间的释放问题。 RAII(Resource Acquisition Is Initia

    2024年02月03日
    浏览(55)
  • 【C++】对于string的学习

    本篇文章针对C++中的string做一些详细的介绍和学习,并且会包含一些关于STL的介绍 注意: 本篇文章只包含基础知识 STL是标准模板库的一个缩写,全称是Standard Template Library C++中定义了一种类,为string,存放在头文件string中 存放C语言风格字符串的头文件是cstring,也就是以’

    2024年02月10日
    浏览(34)
  • 波奇学C++:多态知识点

    结果是 student 0 原因在于重写时只重写函数的实现,就是说相当于Person的fun的声明和Student的函数实现的拼在一起所以缺省值是0。 如果是子类指针或者引用就不是多态调用了只是单存子类对父类的重定义,隐藏函数。 上一篇文章提到的,多态的本质就是基类和派生类的虚表中

    2024年02月09日
    浏览(31)
  • 力扣刷题(C++)知识点

    一,找到数组的中间位置 这个是错的,+=不能分开来   C++ vectorint nums 用法 创建一维数组vector: vectorint nums;  //不指定长度 vectorint nums(n);    //指定长度为n   c++ <numeric> accumulate 函数 accumulate函数实现将一段数字从头到尾累加起来 前两个参数是指定累加的范围,第三个参数

    2024年02月13日
    浏览(36)
  • 一些关于c++的琐碎知识点

    目录 bool强转 const构成重载:const修饰*p  移动构造 new int (10)所做的四件事 this指针---为什么函数里面需要this指针? .和-的区别 new创建对象 仿函数 new和malloc的区别 c++系统自动给出的函数有 delete和delete[ ]区别何在 检查有没有析构函数 explict外部 内存泄漏的本质:丢失了内存地

    2024年02月07日
    浏览(38)
  • C++笔记(细碎小知识点)1

    2024年02月08日
    浏览(27)
  • C++基础知识点整理笔记(四)

    10. C++的内存管理 在C++中,内存被分成五个区:栈、堆、自由存储区、静态存储区、常量区 (一) 栈:存放函数的参数和局部变量,编译器自动分配和释放 (二) 堆:new动态分配的内存,由程序员手动进行释放,否则程序结束后,由操作系统自动进行回收 (三) 自由存储区

    2024年02月15日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包