🌈个人主页:羽晨同学
💫个人格言:“成为自己未来的主人~”
string是用于字符串,可以增删改查
首先,我们来看一下string的底层
接下来,我们来看一下string的常用接口有哪些:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
#include<list>
#include<algorithm>
using namespace std;void test_string1()
{//常用string s1;string s2("hello world");string s3(s2);cout << s3;
}
int main()
{test_string1();return 0;
}
我们可以看到的是,string起到了拷贝字符串的作用。
接下来是一些不常用的接口功能:
string s4(s3, 3, 5);cout << s4 << endl;
我们可以看到这个接口的功能是从下标为3开始,向后拷贝五个字节
string s5(s2, 3);cout << s5 << endl;
我们可以看到,这个接口的目的是从下标为3开始,一直拷贝到结尾
string s6(s2, 3, 30);string s7("hello world", 5);string s8(10, 'x');cout << s6 << endl;cout << s7 << endl;cout << s8 << endl;
在接下来的接口6,7,8,这三个接口当中,想要实现的功能分别为
接口6是下标为3开始到30,由于30大于最大长度,所以到字符串的结尾
接口7是拷贝前5个
接口8是拷贝10个x
接下来,让我们看一下下面的这段代码:
void test_string2()
{//隐式类型转换string s2 = "hello world";string& s3 = "hello world";
}
在这段代码中,涉及到的知识点为隐式类型转换,我们都知道,临时变量具有常性,所以这段代码会出现报错,报错原因是由于权限的放大。
所以,我们需要再前面加上一个const
void test_string2()
{//隐式类型转换string s2 = "hello world";const string& s3 = "hello world";
}
这样子,我们就避免了权限放大的这个问题。
void push_back(const string &s)
{}void test_string2()
{//隐式类型转换string s2 = "hello world";const string& s3 = "hello world";//构造string s1("hello world");push_back(s1);push_back("hello world");
}
在这段代码中我们可以看到,当传参的时候,我们既可以传临时变量,也可以传字符串
接下来让我们简单实现一下string中的operator[]的粗略逻辑:
class string
{
public://引用返回//1.减少拷贝//2.修改返回对象char& operator[](size_t i){assert(i < _size);return _str[i];}
private:char* _str;size_t _size;size_t _capacity;};
这个告诉我们一件什么事情呢?那就是在[]中是存在暴力检查的。