目录
频道首页
C++[STL]库 string详解
收藏
0
The_Byte_Station 最近修改于 2023-10-29 11:57:09

在这里插入图片描述

什么是[STL]?

STL基本组成

STL从广义上讲分为三类

  1. 容器(Container ),是一种数据结构,如list , vector,和deques ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器。
  2. 迭代器( lterator ),提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象。
  3. 算法(Algorithm ),是用来操作容器中的数据的模板函数。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象,函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用。

string类容器

  1. 用字符数组存放字符串容易发生数组越界的错误,而且往往难以察觉。因此,C++标准模板库设计了string 数据类型,专门用于字符串处理。
  2. 要使用string 对象,须包含头文件。
  3. 在用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" ```

在这里插入图片描述

内容大纲
批注笔记
C++[STL]库 string详解
ArticleBot
z
z
z
z
申请加入
主页
会议室
Git管理
文章
云文档