个人主页:平行线也会相交💪
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【C++之路】💌
本专栏旨在记录C++的学习路线,望对大家有所帮助🙇
希望我们一起努力、成长,共同进步。🍓
前言
接下来就开始STL部分的学习了,本文先来学习一下C++中STL的string类
。
目录
- 前言
- 一、什么是string类
- 二、标准库中的string类
- 三、string类的常用接口说明
- (1)string类中的常见构造
- 3.1默认构造函数(string())
- 3.2字符指针构造函数(string(const char* s))
- 3.3字符构造函数(string str("hello");)
- 3.4重复字符构造函数(string s(size_t n, char c))
- 3.5拷贝构造函数(string::string(const string& str);)
- 3.6 构造函数截取子串string(const string& str, size_t pos, size_t len = npos);
- 字符串的比较
- (2)std::string类的析构函数
- (3) string类对象的修改操作
- push_back()
- append()
- operator+=
- (4)string类对象的访问及遍历操作
- operator[]
- 迭代器的小拓展
一、什么是string类
首先,string类
是一个管理字符串的类。在日常中,字符串中是非常常见的,但凡是复杂一点的类型,都需要用字符串来进行展示。
在C语言中,我们学习了strxxx的库函数(管理字符串)
,但是其实C语言中strxxx的库函数
不是很好,因为C语言中str系列的库函数只能对字符串进行一些简单的操作,比如说求字符串的长度,字符串的拷贝,很明显不能满足我们日常的需求。
而在C++中的string类中,我们可以对字符串进行各种增删查改和一些算法操作。日常中一些很复杂的信息都是用字符数组来进行展示的,故C++中的string类就是用来管理字符数组的。
这里推荐一下学习C++文档的网址:
网址1
网址2(推荐用网址2),ctrl+F进行搜索。
二、标准库中的string类
我们如果想要使用string类的话就需要包头文件,STL本身就属于C++标准库中的一部分,而标准库中的内容都在std的命名空间中
。
所以如果我们想要使用string类的话,我们可以展开std的命名空间(即string s1)
,如果我们不展开std的命名空间
的话,我们可以这样使用:std::string s2
。
我们先来简单使用一下string类:
#include<iostream>
using namespace std;
int main()
{
string s1;//展开了命名空间就是这样使用
std::string s2;//没有展开命名空间就这样使用就可以
std::string name("李四");
name = "李四";
return 0;
}
这里是string类的成员函数,其实就是
string类的默认成员函数
。
我们可以看到这里constructor中实现了7个构造函数
,请看:
我们在来看destructor
中的析构函数,请看:
我们在来看operator=
中里一共有3个赋值运算符重载,请看:
三、string类的常用接口说明
(1)string类中的常见构造
3.1默认构造函数(string())
string str
:创建一个空字符串对象
3.2字符指针构造函数(string(const char* s))
字符指针构造函数:从一个指向字符串的字符指针str中创建字符串对象。
const char *s = "Hello, World!";
string str(s); // 字符指针创建字符串
3.3字符构造函数(string str(“hello”)😉
字符构造函数:一组字符创建字符串对象,比如string str("hello");
3.4重复字符构造函数(string s(size_t n, char c))
重复字符构造函数(string s(size_t n, char c)
):创建一个包含n个字符c的字符串对象。第一个参数是所需长度,第二个参数是重复的字符。
比如:
string str(5, 'x'); // 创建一个包含5个重复字符'x'的字符串
。
3.5拷贝构造函数(string::string(const string& str);)
重复构造函数:从一个已存在的字符串对象创建新的字符串对象。
语法:string::string(const string& str);
拷贝构造函数的参数是一个常量引用,它引用了要被复制的字符串对象。拷贝构造函数会创建一个新的字符串对象,该对象的内容与被复制的字符串对象相同。
请看举例:
3.6 构造函数截取子串string(const string& str, size_t pos, size_t len = npos);
string(const string& str, size_t pos, size_t len = npos)
是字符串类std::string的构造函数之一,它有三个参数:
const string& str
:一个常量引用,表示要从中截取子串的原字符串。size_t pos
:一个整数,表示从哪个位置开始截取子串。size_t len = npos
:一个整数,表示要截取的子串的长度,默认值为std::string::npos,表示截取从pos开始到结尾的所有字符。
该构造函数的作用:创建一个新的字符串对象,其中包含从原字符串的pos位置开始,长度为len的子串。如果len没有指定或者指定为std::string::npos,则截取到原字符串的结尾。
例如:假设有一个字符串str=“Hello,
world!”,我们想要从中截取子串"world",可以通过如下方式使用该构造函数:std::string sub_str(str, 7, 5); // 从位置7开始截取长度为5的子串
其中,7表示从第8个字符开始,5表示指定的子串长度。在这个例子中,sub_str 的值为 “world”。
需要注意的是,在使用该构造函数时,pos和len都必须是有效的,否则可能导致未定义的行为。例如,如果len的值超过原字符串的长度,可能会访问非法内存。为了避免这种情况,可以使用std::string::substr()函数来截取子串。
string (const string& str, size_t pos, size_t len = npos);
这里npos
是什么呢?我们来看一下:
npos
是一个静态成员变量
再举一些比较有趣的例子,请看:
字符串的比较
现在来看一下比较字符串的内容,请看:
好了,以上就是string类中的常见的默认构造函数,用到比较多的构造函数:无参的构造,带参的字符串构造和拷贝构造。
(2)std::string类的析构函数
std::string
类的析构函数会自动释放字符串所占用的内存,其定义如下:
~string();
因为std::string
类是基于动态内存分配来实现字符串的,因此在对象被销毁时,它所占用的内存也需要被释放。std::string
类的析构函数会自动调用delete[]
来释放动态分配的内存,确保不会出现内存泄漏的情况。
需要注意的是,当在std::string
对象的作用域结束时,析构函数会被自动调用,对应的内存也会被释放。在删除对象时,不需要显式调用析构函数。
(3) string类对象的修改操作
push_back()
push_back()
:用于在字符串的末尾添加一个新的字符。
例如:
string str = "hello";
str.push_back('!');
// 现在str的值为 "hello!"。
append()
append()
:用于在字符串的末尾添加新的字符或字符串。
例如:
string str = "hello";
str.append(" world");
// 现在str的值为 "hello world"
operator+=
operator+=
:在字符串后追加字符串str。
(4)string类对象的访问及遍历操作
operator[]
operator[]
:用于访问字符串中每一个字符的下标运算符。
第一种语法:用于非常量对象,返回一个指向字符串中位置 pos 的字符的引用。可以对该引用进行修改,从而改变字符串中该字符的值。
第二种语法:用于常量对象,返回一个指向字符串中位置 pos 的字符的常引用。由于该引用是常量引用,因此不能对它进行修改,只能用于读取字符串中的字符。
这里我们表面上看着str1[0]++
和str2[0]++
是一样的,但实际上是不一样的。
迭代器的小拓展
下面是迭代器的一个小拓展,这里先了解一下:
我们也可以对迭代器进行修改,请看:
范围for底层就是一个迭代器:
任何容器都支持迭代器
int main()
{
list<int> lt;
lt.push_back(520);
lt.push_back(521);
lt.push_back(522);
lt.push_back(523);
list<int>::iterator lit = lt.begin();
while (lit != lt.end())
{
cout << *lit << ' ';
lit++;
}
cout << endl;
return 0;
}
总结一下:
迭代器是一个像指针一样的类型,有可能是指针,有可能不是指针。
iterator提供了一种统一的方式来访问修改容器的数据。
算法可以通过迭代器去修改容器中的数据。
好了,本文就到这里了,主要介绍了string类中的常见接口函数。算是打开了string类的一个大门。
一起加油吧,各位友友们!再见啦!!!