什么是[STL]?
STL基本组成
STL从广义上讲分为三类
- 容器(Container ),是一种数据结构,如list , vector,和deques ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器。
- 迭代器( lterator ),提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象。
- 算法(Algorithm ),是用来操作容器中的数据的模板函数。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象,函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用。
string类容器
- 用字符数组存放字符串容易发生数组越界的错误,而且往往难以察觉。因此,C++标准模板库设计了string 数据类型,专门用于字符串处理。
- 要使用string 对象,须包含头文件。
- 在用C+编程时,要优先考虑用string 对象来处理字符串,因为其用法比字符数组更简单,而且不容易出错。
string容器的初始化
显而易见,string容器是一个模板类。所以string类的初始化是由string类的构造函数实现的。因为string类的构造函数可以重载,所以string的初始化繁多,这里主要详细讲几个比较常用的。
string s1; //默认构造函数初始化,空字符串
string s2(s1); //拷贝构造函数初始化,s2是s1的副本
string s3=s1; //操作符初始化,s3是s2的副本
string s4("hello"); //构造函数赋值初始化,s4为“hello"
string s5="hello"; //同第5行
string s6(n,'a'); //s6为n个a字符组成的字符串
string s7=string("hello"); //用string类构造函数生成的临时类初始化
string s8(string("hello")); //同第13行
string容器的输入
cin输入
//cin不能读取空格//遇到空格就停止输入
string s1;
cin>>s1;
cout<s1.size()时,为未定义行为;当pos=s1.size(),拷贝一个空字符。第二个将s1从下标pos开始拷贝,拷贝len个字符。当pos>s1.size()时,为未定义行为;当pos=s2.size(),拷贝一个空字符。
string s1("hello");
stiring s2(s1,1);
//s2为” ello",长度为4
string s3(s1,5); //s3为"",长度为0
- List item
string s8(s1,6);
//错误,未定义的行为,抛出异常
string s4(s1,1,3); // s4为”ell",长度为3
string s5(s1,1,8); //正确,s5为”ello",长度为4
string s6(s1,5,8); // s6为"",长度为0
string s7(s1,6,1); //错误,未定义的行为,抛出异常
## string容器的比较
除了可以用 <、<=、==、!=、>=、> 运算符比较 string 对象外,string 类还有 compare 成员函数,可用于比较字符串。compare 成员函数有以下返回值:● 小于 0 表示当前的字符串小;● 等于 0 表示两个字符串相等;● 大于 0 表示另一个字符串小。
string s1("hello"),s2("hello,world"); int k = s1.compare(s2);
k = s1.compare(1, 2, s2, 0, 3);
//比较s1的子串 (1,2) 和s2的子串 (0,3)
k = s1.compare(0, 2, s2);
// 比较s1的子串 (0,2) 和 s2
k = s1.compare("Hello");
k = s1.compare(1, 2, "Hello");
//比较 s1 的子串(1,2)和"Hello”
k = s1.compare(1, 2, "Hello", 1, 2);
//比较 s1 的子串(1,2)和 "Hello" 的子串(1,2)
## 获取string容器中的子字符串
使用string的成员函数substr(pos,n)substr(pos,n);
//返回一个string对象 //返回的对象包含s从pos下标开始的n个字符 //pos和n均为可选参数 //pos默认为下标0;n默认为s.size()- pos(即到字符串结尾)。
string s("value");
string s2=s.substr();//s2="value"
string s3=s.substr(2);//s3="lue"
string s4=s.substr(5); //s4=""
string s5=s.substr(6); //错误,越界
string s6=s.substr(1,2); //s6="al"
string s7=s.substr(1,7); //s7="alue"
string s8=s.substr(5,7); //s8="";
string s9=s.substr(6,7) //错误,越界
## string容器的交换
使用string成员函数swap()
string s1="hello",s2="world"; s1.swap(s2);
## string容器的增加
使用string成员函数insert
iterator insert(iterator pos,CharT ch)
void insert(iterator pos,size_type count ,CharT ch)
void insert(iterator pos,InputIt first,InputIt last)
string s1("value"); s1.insert(s1.begin(),'s'); //s1="svalue"
s1.insert(s1.begin(),1,'s'); //s1="ssvalue"
s1.insert(s1.begin(),s1.begin(),++s1,begin()); "s1=sssvalue"
s1.insert(s1.end(),{'1','2'}); //s1="sssvalue12"
## string容器的删除
basicstring & earse(sizetype pos=0,size_type n=n-pos) //删除s从pos下标开始的n个字符,并返回删除后的s。当pos > s.size()时,报错
iterator erase(const_iterator position) //删除s迭代器position位置的字符,并返回下一个字符的迭代器。
iterator erase(constiterator first, constiterator last) //删除s迭代器[first,last)区间的字符,并返回last字符的迭代器。
string s1("value");
string s2("value");
string s3(""value");
string s4("value");
s1.erase(); //执行后,s1为空
s2.erase(0,2);//执行后,s2为"lue”
s3.erase(s3.begin());//执行后,s3为"alue"
s4.erase(s4.begin(),++s4.begin());//执行后,s4为"alue"
## string容器的查找
string 类有一些查找子串和字符的成员函数,它们的返回值都是子串或字符在 string 对象字符串中的位置(即下标)。如果查不到,则返回 string::npos。string: :npos 是在 string 类中定义的一个静态常量。这些函数如下:● find:从前往后查找子串或字符出现的位置。● rfind:从后往前查找子串或字符出现的位置。● find_first_of:从前往后查找何处出现另一个字符串中包含的字符。例如:s1.find_first_of(“abc”); //查找s1中第一次出现"abc"中任一字符的位置● find_last_of:从后往前查找何处出现另一个字符串中包含的字符。● find_first_not_of:从前往后查找何处出现另一个字符串中没有包含的字符。● find_last_not_of:从后往前查找何处出现另一个字符串中没有包含的字符。
string s="I love China!"; s.find('C'); //查找字符'C'出现的位置
s.find("China"); //查找字符串”China"出现的位置
s.find("love",2); //从下标为2开始查找“love"
s.findfirstof("love"); //查找“love"第一次出现的位置
s.findlastof("love"); //查找”love"最后一次出现的位置
## string容器的修改
使用string成员函数replace
string s(" i very love China!");
const charcp1 = "truly"; const charcp2 = "truly!!!"; string str1 = "really"; string str2 = "really!!l";
//1.将s从下标2开始删除4个字符,删除后在下标2处插入cp1 s.replace(2,4,cp1); //s=" i truly love China!"
//2.将s从个标2开始删除5个字符,删除后在下标2插入cp2的前5个字符 s.replace(2,5, cp2,5); //s=" i truly love China!"
//3.将s从下标2开始删除5个字符,删除后在下标2插入str1 s.replace(2,5, str1); //s="i really love China!"
//4.将s从下标2开始删除6个字符,删除后在下标2插入str2 //从下标0开始的6个字符 s.replace(2,6, str2,0,6); //s="i really love China!"
//5.将s从下标2开始删除6个字符,删除后在下标2插入4个字符 s.replace(2,6,4,""); //s="i**** love China!"
## string容器的拼接
除了可以使用+和+=运算符对 string 对象执行字符串的连接操作外,string 类还有 append 成员函数,可以用来向字符串后面添加内容。append 成员函数返回对象自身的引用。
string s="hello",s1="world";
s.append(s1); //s="helloworld"
s.append(s1,1,2); //s="helloworldor"
s.append(2,'k'); //s="helloworldorkk"
s.append("nihao",2,3); //s="helloworldorkkhao" ```