Hello!!大家早上中午晚上好!!今天开始关于C++STL六大组件部分内容复习!!!
一、string
1.1string的出现时间
string严格来说不属于STL容器,因为string的出现早于STL,这里一起把它归并到序列式容器中去,好一起理解!
1.2序列式容器
所谓序列式容器是以线性方式存储元素的容器,序列式容器不对存储的元素进行排序,元素的顺序与它们存储的顺序相同,常见的序列式容器有:string、vector、list、deque
1.3string的理解
string是管理字符串的类,string对字符数组进行管理,string是对字符数组进行增删查改,string是把算法作用在字符串数组上;
二、string的使用
string的构造函数

2.1string();
string的默认构造函数,作用构造一个空串:
cpp
int main()
{
string s1;
return 0;
}
监视窗口可以看到,s1是一个空串,有效元素为0;
2.2string(const string&str);
string的拷贝构造函数,作用用一个string对象拷贝构造生成一个新的string对象;
cpp
int main()
{
//string s1;
string s1("hello world!!");
string s2(s1);
return 0;
}
监视窗口可以看到s1拷贝构造s2后,s2里存储的内容跟s1的一摸一样;

2.3string(const string&str,size_t pos,size_t len=npos);
作用用string对象里的pos位置往后的len个元素拷贝构造生成一个新对象;
注意:pos为数组下标,如果不写len的个数,默认是从pos位置开始拷贝到\0之前的字符串;
cpp
int main()
{
//string s1;
string s1("hello world!!");
//string s2(s1);
string s2(s1, 5, 7);
string s3(s1, 1);
return 0;
}

2.4string(const char* s);
作用用一个字符指针指向的内容拷贝构造生成一个新的string对象;
cpp
int main()
{
const char* ch1 = "hello world!!";
char ch2[10] = { 'h','e','l','l','o' };
//char ch2[] = { 'h','e','l','l','o' };//报错
string s1(ch1);
string s2(ch2);
return 0;
}

注意:字符串指针指向的内容必须要有\0作为结束标识符,不然会报错!


2.5 string(const char*s,size_t n);
作用用字符指针指向的内容的前n个字符拷贝构造生成一个新的string对象;
cpp
int main()
{
const char* ch1 = "hello world!!";
string s1(ch1,5);
return 0;
}

2.6 string(size_t n,char c);
作用用n个字符构造生成一个新的string对象;
cpp
int main()
{
const char* ch1 = "hello world!!";
string s1(6, 'x');
return 0;
}

2.7template <class InputIterator>
string(InputIterator first,InputIterator last);
作用用一个迭代器区间拷贝构造生成一个新的string对象;
cpp
int main()
{
char ch[20] = { "hello world!!!!" };
string s1(ch, ch+10);
return 0;
}

三、string 的赋值运算符重载函数

3.1 string&operator=(const string&str);
作用把一个已存在的string对象赋值给另一个已存在的string对象;
cpp
int main()
{
char ch[20] = { "hello world!!!!" };
string s1(ch, ch+10);
string s2("welcome!!");
s1 = s2;
return 0;
}
赋值前:

赋值后:

3.2 string&operator(const char*s);
作用 把一个字符指针指向的内容赋值给一个已存在的string对象;
cpp
int main()
{
const char* ch1 = "hello world!!!";
string s1 = "welcome!!";
s1 = ch1;
return 0;
}
赋值前:

赋值后:

3.3 string&operator=(char c);
作用 用一个字符赋值给一个已存在的string对象;
cpp
int main()
{
//const char* ch1 = "hello world!!!";
//string s1 = "welcome!!";
//s1 = ch1;
char c = 'Y';
string s1("XXXXXX");
s1 = c;
return 0;
}
赋值前:

赋值后:

四、capacity(数据存储的相关接口)
4.1 查看有效存储数据个数
cpp
int main()
{
string s1("helloworld!!!");
cout << s1.size() << endl;
return 0;
}

计算的是\0之前的字符个数;
4.2查看存储字符串的空间大小

cpp
int main()
{
string s1("helloworld!!!");
cout << s1.size() << endl;
cout << s1.capacity() << endl;
return 0;
}

字符串的有效数据个数为13,存储字符串的空间大小为15;

4.3开空间并初始化

void resize(size_t n);作用:开n个开空间大小并用'\0'初始化:
cpp
int main()
{
string s1;
s1.resize(30);
return 0;
}
resize前:

resize后:

void size(size_t n,char c); 作用:开空间并用字符初始化:
cpp
int main()
{
string s1;
//s1.resize(30);
s1.resize(20, 'x');
return 0;
}
resize前:

resize后:

resize和capacity的关系:
我们看到当resize 30时capacity的大小为31,当resize 20时capacity的大小也为31;

4.4开空间不初始化

cpp
int main()
{
string s1;
//s1.resize(30);
//s1.resize(32);
s1.reserve(30);
return 0;
}
reserve前:

reserve后:

可以看出resize和reserve的区别,resize开空间的同时初始化内存空间;reserve单存开空间不会对内存空间初始化;
4.5对string对象判空操作

作用 当string对象为空串时返回false,当string对象不为空串时返回true;
cpp
int main()
{
string s1;
//s1.resize(30);
//s1.resize(32);
string s2("hello world!!!");
if (s1.empty())
{
s1 += "hello world!!!";
}
if (!s2.empty())
{
s2 += "welcome!!!";
}
cout << s1 << endl;
cout << s2 << endl;
return 0;
}

4.6清空字符串操作

作用 对字符串的数据清空变成空串;
cpp
int main()
{
string s1("hello world!!!");
cout << s1 << endl;
s1.clear();
cout << s1 << endl;
return 0;
}
clear前:

clear后:


五、element access(元素访问相关接口)
5.1 对string对象下标访问操作

cpp
int main()
{
string s1("hello world!!!");
cout << s1[2] << endl;
return 0;
}

operator[]有两个版本,当对象是普通对象时可以对对象里的字符串进行访问和修改;
cpp
int main()
{
string s1("hello world!!!");//普通对象时
s1[2] = 'e';
cout << s1[2] << endl;
return 0;
}

当对象是const对象是只能对其进行访问操作;
cpp
int main()
{
//string s1("hello world!!!");
const string s1("hello world!!!");//const 对象时
s1[2] = 'e';//编译报错
cout << s1[2] << endl;
return 0;
}

5.2对最后/最前的一个字符的访问操作
普通对象可对最后一个字符进行访问和修改操作;
cpp
int main()
{
string s1("hello world X");
s1.back() = 'Y';
cout << s1 << endl;
return 0;
}

对const对象只能访问;
cpp
int main()
{
const string s1("hello world X");
s1.back() = 'Y';//报错
cout << s1 << endl;
return 0;
}


跟back的操作类似;
cpp
int main()
{
string s1("hello world X");//普通对象
s1.front() = 'Y';
cout << s1 << endl;
return 0;
}

cpp
int main()
{
const string s1("hello world X");//const对象
s1.front() = 'Y';//报错
cout << s1 << endl;
return 0;
}

六、modifiers(修改)
6.1字符串加等操作

string& operator+=(const string&str);
作用 一个string对象加等给另一个字符串对象;
cpp
int main()
{
string s1;
s1 += "hello";
cout << s1 << endl;
string s2("world");
s1 += s2;
cout << s1 << endl;
return 0;
}

string& operator+=(const char*s);
作用 把字符指针指向的内容+=给一个string对象;
cpp
int main()
{
//string s1;
//s1 += "hello";
//cout << s1 << endl;
//string s2("world");
//s1 += s2;
//cout << s1 << endl;
const char* ch1 = "world";
string s1("hello");
s1 += ch1;
cout << s1 << endl;
return 0;
}

string& operator+=(char c);
作用 把一个字符加等到一个string对象里;
cpp
int main()
{
char c = 'X';
string s1("YYYYYYYYY");
s1 += c;
cout << s1 << endl;
return 0;
}

---------------------------------------------------------------------------------------------------------------------------------string& operator+=(initializer_list<char> il);
作用 把一个initializer_list<char> 的列表初始化的数组加等给string 对象;
cpp
int main()
{
string s1("hello");
initializer_list<char> il = { 'w','o','r','l','d','!' };
s1 += il;
cout << s1 << endl;
return 0;
}

6.2字符串尾插操作

作用 把一个字符尾插到string对象中;
cpp
int main()
{
string s1("hello");
s1.push_back('Y');
cout << s1 << endl;
return 0;
}

6.3字符串的删除操作

string& erase(size_t pos =0,size_t len= npos);
作用 删除pos位置往后的 len个字符;
cpp
int main()
{
string s1("hellXXXo");
s1.erase(4, 3);
cout << s1 << endl;
return 0;
}

iterator erase (const_iterator p);
作用 删除迭代器 p所指向的元素;
cpp
int main()
{
string s1("hellXXXo");
string::iterator it = s1.end();
s1.erase(it-1);
cout << s1 << endl;
return 0;
}

iterator erase(const_iterator first,const_iterator last);
作用 删除迭代器区间 first到last之间的元素;返回last位置的迭代器;
cpp
int main()
{
string s1("hellXXXo");
string::iterator it = s1.begin();
string::iterator it2=s1.erase(it + 4, it + 7);
cout << s1 << endl;
cout << *it2 << endl;
return 0;
}

今天就复习到这里,如果您有所收获记得点赞收藏+关注哦!!谢谢!!!
咱下期见!!!