C++初阶——string的使用(上)
C++初阶——string的使用(上)
一、STL简介
1.什么是STL
STL(standard template libaray-标准模板库)
:是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。
2.STL的六大组件
二、String
1.什么是string
string
是表示字符串的字符串类- 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作
string
的常规操作
我们来看一下cplusplus网站给出的英文定义:
链接: link
这里详细介绍了string
有哪些成员变量,哪些成员函数,以及成员常量和非成员函数重载……在本期内容中,我们聚焦于string类
的使用,后面会详细讲解string的模拟实现,在探索底层奥妙的同时也能复习一下前面学过的内容。
2.string的使用介绍
(1)string类的实例化(构造函数、拷贝构造函数)
我们来看这一段代码:
和我们之前学过的内容一样,string
是一个管理字符串的类,它是一个图纸,需要我们先进行实例化,在实例化的过程中,会调用string
的构造函数,对于构造函数,分为需要传参的构造函数以及默认构造函数(无参的,全缺省的,我们不写编译器自动生成的),点击链接网站的constructor
,查看string
的构造函数:
- 不难看出,这里的构造函数有很多种,可以满足各种各样的传参模式。这里实例化的
s1
就是调用的第一个构造函数;s2
和s3
调用的是第四个构造函数,传一个字符串;s4
调用的是第6个,用10个字符‘*’
初始化一个字符串;至于s5
就有些不同了,这里是一个拷贝构造,调用的是第2个——拷贝构造函数(形参是对一个类对象的引用) - 将
s1
赋值给s2
,这里用到了运算符重载,包括后面的<<
,==
,>
,<
,当然还有+
,+=
之类的,这里我们先不详细介绍 - 对于
s6
的示例化采用的是第三个构造函数,string (const string& str, size_t pos, size_t len = npos);
意思是s6是由s3取从第五6个位置开始,往后5个字符来初始化,pos就是字符串中字符的位置,从0开始,len就是选取的字符串的长度,那么这里为什么提供一个缺省参数呢?如果我们不指定长度,它会一直取到结尾;npos
是什么?我们来看一下:
npos
是一个无符号整型,当它为-1,对应的就是整型的最大值。这里的s7
就是如此,而s8
传了具体长度,但是超过了s3
的长度,也是自动取到s3
的结尾为止。 - 至于最后的
s1="11111";
,左边是一个类对象,右边是一个字符串,它们的类型不同,因此这里涉及到隐式类型转换的问题。 - 运行结果如图:
(2)string的运算符重载
刚才已经提到了<<
,>
,<
,==
的运算符重载,我们接着探究:
这里的+=
就是在字符串的尾部插入数据,string
的运算符重载也非常简单,根据运算符本身的意思就可以理解。
(3)常用成员函数size、begin、end,迭代器iterator,常用遍历方法
- 我们先实例化一个对象s1,通过对象访问函数
size
,得到的是字符串的长度,使用for循环进行遍历:
Returns the length of the string, in terms of bytes. 迭代器
:迭代器是STL六大组件之一,非常重要,这里的迭代器我们可以理解为指针,用来遍历字符串,这里的迭代器先指向的字符串的首个位置,用begin
进行获取,在循环的过程中不断++,向后移动,和指针的操作一样,到结尾为止,使用end
函数获取字符串的末位置:
- 当然,这里还可以使用范围for进行遍历,
auto关键字
可以自动识别类型,对于一些类型较为复杂的迭代器,使用auto
更为方便,比如说这里的vector
和list
,至于vector和list,后面会详细讲解。 reverse
是颠倒顺序,属于算法库,需要包含头文件<algorithm>
,同样的sort
是排序,也属于算法库,这里稍微使用一下,感受感受。- 运行结果如图:
(4)const迭代器const_iterator、反向迭代器reverse_iterator、配套使用rbegin,rend
示例代码:
- 这里使用了
反向迭代器reverse_iterator
,也就是说这里是倒过来遍历字符串,所以开始的位置就是字符串的尾部,配套的找尾使用rbegin
,结束是rend
,至于这里为什么使用auto自动判断类型,是因为从string类中取出反向迭代器的代码比较长,不方便,这里就体现了auto关键字的重要作用。
- 至于
const迭代器
,也是很好理解的,当我们不想修改内容时,就使用const_iterator
。 - 运行结果如图:
(5)字符串的插入删除处理(push_back、append、insert、assign、erase)
代码如下:
push_back
是向字符串的末尾插入字符,使用说明如下:
append
是在字符串的末尾加上一个字符串,使用方法如图所示:
其中包括在一个字符串后添加一个string类
,指定截取某一段位置,或者添加字符串常量
,指定需要的长度,或者添加某个字符,指定所需个数,使用方法简单明了。assign
的用法也很简单,就是用新的内容替换以前的内容。
insert
和erase
是我们熟悉的,可以在指定位置插入和删除字符,使用介绍如下:
三、本期代码资源
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<algorithm>
using namespace std;//int main()
//{
// string s1;
// string s2("张三");
// string s3("hello world");
// string s4(10, '*');
// string s5(s2);
// s1 = s2;
// cout << s1 << endl;
// cout << s2 << endl;
// cout << s3 << endl;
// cout << s4 << endl;
// cout << s5 << endl;
//
// string s6(s3, 6, 5);
// cout << s3 << endl;
// cout << s6 << endl;
//
// cout << (s1 == s2) << endl;
// cout << (s1 > s2) << endl;
//
// string s7(s3, 6);
// cout << s7 << endl;
//
// string s8(s3, 6, 100);
// cout << s8 << endl;
//
// string url("https://en.cppreference.com/w/");
// string sub1(url, 0, 5);
// string sub2(url, 8, 13);
// string sub3(url, 22);
// cout << sub1 << endl;
// cout << sub2 << endl;
// cout << sub3 << endl;
//
// s1 = "1111";
// cout << s1 << endl;
//
// s1 = '2';
// cout << s1 << endl;
//
// return 0;
//}//class string
//{
//public:
// string operator+=(char ch);
// string operator+=(const char* str);
//private:
// char* _str;
// size_t _size;
// size_t _capacity;
//};//int main()
//{
// string s1("hello");
// s1 += ' ';
// s1 += "world";
// cout << s1 << endl;
//
// size_t x = 0;
// cin >> x;
// string xstr;
// while (x)
// {
// size_t val = x % 10;
// xstr += ('0' + val);
// x /= 10;
// }
// cout << xstr << endl;
//
// return 0;
//}//int main()
//{
// string s0;
// string s1("hello world");
// cout << s1 << endl;
// cout << s1.size() << endl;
//
// size_t i = 0;
// for (i = 0; i < s1.size();i++)
// {
// s1[i]++;
// }
// cout << s1 << endl;
//
// s1[0]--;
// for (i = 0; i < s1.size(); i++)
// {
// cout << s1[i] << " ";
// }
// cout << endl;
//
// //char s3[] = "hello world";
// //s3[1]++; //-> *(s3+1)
// //s1[1]++; //s1.operator[](1);
//
// //迭代器
// string::iterator it = s1.begin();
// while (it != s1.end())
// {
// (*it)--;
// it++;
// }
// cout << s1 << endl;
//
// it = s1.begin();
// while (it != s1.end())
// {
// cout << (*it) << " ";
// it++;
// }
// cout << endl;
//
// for (char ch : s1)
// {
// cout << ch << " ";
// }
// cout << endl;
//
// vector<int> v;
// v.push_back(1);
// v.push_back(2);
// v.push_back(3);
// v.push_back(4);
// v.push_back(5);
// vector<int>::iterator vit = v.begin();
// while (vit != v.end())
// {
// cout << *vit << " ";
// vit++;
// }
// cout << endl;
//
// list<int> lt;
// lt.push_back(10);
// lt.push_back(20);
// lt.push_back(30);
// lt.push_back(40);
// lt.push_back(50);
//
// list<int>::iterator lit = lt.begin();
// while (lit != lt.end())
// {
// cout << *lit << " ";
// lit++;
// }
// cout << endl;
//
// reverse(v.begin(), v.end());
// reverse(lt.begin(), lt.end());
//
// for (auto e : v)
// {
// cout << e << " ";
// }
// cout << endl;
//
// for (auto e : lt)
// {
// cout << e << " ";
// }
// cout << endl;
//
// sort(v.begin(), v.end());
// for (auto e : v)
// {
// cout << e << " ";
// }
// cout << endl;
//
// return 0;
//}//void Func(const string& s)
//{
// string::const_iterator it = s.begin();
// while (it != s.end())
// {
// cout << *it << " ";
// it++;
// }
// cout << endl;
// auto rit = s.rbegin();
// while (rit != s.rend())
// {
// cout << *rit << " ";
// rit++;
// }
// cout << endl;
//}
//
//int main()
//{
// string s1("hello world");
// //string::reverse_iterator rit = s1.rbegin();
// auto rit = s1.rbegin();
// while (rit != s1.rend())
// {
// (*rit) += 3;
// cout << *rit << " ";
// rit++;
// }
// cout << endl;
// Func(s1);
//
// return 0;
//}//int main()
//{
// string s1("hello world");
//
// s1.push_back('!');
// cout << s1 << endl;
//
// s1.append("ssssss");
// cout << s1 << endl;
//
// s1.assign("111111111");
// cout << s1 << endl;
//
// s1.insert(0, "hello");
// cout << s1 << endl;
//
// s1.insert(5, "world");
// cout << s1 << endl;
//
// s1.insert(0, 10, 'x');
// cout << s1 << endl;
//
// s1.insert(s1.begin()+10, 10, 'y');
// cout << s1 << endl;
//
// s1.erase(5, 6);
// cout << s1 << endl;
//
// return 0;
//}
本期总结+下期预告
本期内容介绍了STL——标准模板库,以及String的使用方法,String的使用内容还有很多,下期内容将结合之前写过的顺序表,继续介绍String的内存管理以及其他成员函数!
感谢大家的关注,我们下期再见!