Bootstrap

备赛蓝桥杯:第四章:string

大家好,本人这两天学习到string这章,发现只是很细碎,因此整理下来

这里只是很粗浅的整理使用方法,不涉及深层原理,希望对你有帮助

1.string概念

C++中引入这个类型来处理字符串,是一种更高级的封装,string中包含大量的方法,是的对字符串的操作更加简单。

必须添加头文件<string>

2.string常见操作

string ⽂档:https://legacy.cplusplus.com/reference/string/string(这个可能很难懂,所以我接下来罗列了一部分)

2.1创建字符串

string s1;//创建空字符串
string s2="hello world";
string s3("hello world");//创建字符串
string s4=s;//用现成的字符串初始化另外一个字符串

注意,s2,s3中的字符串不再以\0作为结束标志了(C形式的字符串是以\0为结束标志的)

注意:这仅仅是示意图,实际上的string类型比这个要复杂的多,需要学习类和对象的知识

string类型和char数组类型还有一个区别:string类型的字符串可以直接赋值,而char类型的数组不行(因为数组名是首元素的地址,地址是常量,怎么能把常量值赋给常量值呢)

2.2string字符串的输入

2.2.1cin

#include<iostream>
using namespace std;
#include<string>
int main()
{
string s;
cin>>s;
cout<<s;
return 0;
}

输入的字符串不带空格没问题,但是如果带空格,就不行了

因为cin在读取字符串的时候,遇到空白字符的时候,就认为字符串结束了,不再继续往后读取剩余的字符,同时将已经读取到的字符串末尾加上\0,直接储存起来

2.2.2getline

需要<string>头文件,用于从输入流中读取一行文本,将其存储为字符串。

有两种不同形式,对应着字符串结束方式

istream& getline (istream& is, string& str);
istream& getline (istream& is, string& str, char delim);

istream 是输⼊流类型, cin 是 istream 类型的标准输⼊流对象。

ostream 是输出流类型, cout 是 ostream 类型的标准输出流对象。

getline 函数是输⼊流中读取⼀⾏⽂本信息,所有如果是在标准输⼊流(键盘)中读取数 据,就可以传 cin 给第⼀个参数。

第一种getline以换行符作为字符串的结束标志,一般格式是:

getline(cin, string str)
//cin -- 表⽰从输⼊流中读取信息
//str 是存放读取到的信息的字符串

这种形式的getline从函数输入流(如cin)中读取文本,直到遇到换行符为止,然后将读取到的文本(不包含\n)存储到指定的string类型的变量str中

第二种getline函数允许用户自定义结束标志

getline(cin, string str, char delim)
//cin -- 表⽰从输⼊流中读取信息
//str 是存放读取到的信息的字符串
//delim 是⾃定义的结束标志

这种形式的getline从函数输入流(如cin)中读取文本直到遇到⽤⼾指定的结束标志字符为止,然后将读取到的文本(不包含\n)存储到指定的string类型的变量str中

2.3size()

C++中关于字符串的操作函数都是包含在string中的,所以需要调用这些函数的时候,通常使用.点操作符

使用示例:

int main()
{
string s="hello world";
cout<<s.size();<<endl;
return 0;
}

为什么要使用点操作符?

在前面学double char int等内置类型的时候,不需要使用点操作符;string是C++提供的更复杂的封装类型,在string类型的变量中加入了操作字符串的各种函数,比如求字符串长度,字符串末尾插入一个字符等操作。所以要对string类型变量进行各种操作,就可以使用.操作符调用这些函数

那getline为啥不用.操作符?明明也是对string类型的操作呀

因为getline是全局函数,操作的是输入流和字符串对象,而不是字符串对象的内部行为

而size是成员函数,属于std::string类,是字符串队形自身提供的功能

size函数可以用来遍历字符串,注意string类型的字符串是可以用下标访问的

int main()
 {
 string s = "abcdef";
 int i = 0;
 for(i = 0; i < s.size(); i++)
 {
 cout << s[i] << " ";
 }
 return 0;
 }

2.4迭代器

迭代器是一种对象,可以用来遍历容器中的元素,作用类似于指针或数组下标

访问迭代器指向的值需要解引用

string提供了多种迭代器,⽤于遍历和操作字符串中的内容。这⾥给⼤家介绍⼀种最常 ⽤的迭代器。

2.4.1begin() end()

begin():返回指向字符串第一个字符的迭代器,需要一个迭代器的变量来接收。

end():返回指向字符串最后一个字符的下一个位置的迭代器(该位置不属于字符串)

他们返回的迭代器类型是string::iterator

迭代器是可以进行大小比较的,也可以进行+或者-整数运算的

比如it++让迭代器前进一步;it--让迭代器后退一步

同一个容器的两个迭代器也可以相减,结果的绝对值就是两个绝对值中间的元素个数

(很像指针!)

#include <iostream>
using namespace std;
#include<string>
int main()
{
	string s="abcdef";
	string::iterator it=s.begin();
	string::iterator it2=s.end();
	cout<<it2-it<<endl;
	return 0;
}

正序遍历:

#include <iostream>
using namespace std;
#include<string>
int main()
{
	string s="abcdef";
	for(string::iterator it=s.begin();it!=s.end();it++)
	{
	cout<<*it<<' ';	
	}
	return 0;
}

当然,这里的it可以是auto类型

逆序遍历:

#include <iostream>
using namespace std;
#include<string>
int main()
{
	string s="abcdef";
	for(string::iterator it=s.end()-1;it>=s.begin();it--)
	{
	cout<<*it<<' ';	
	}
	return 0;
}

注意-1的问题啊

通过迭代器找到元素后,改变迭代器指向的元素是可以直接改变字符传内容的!(这个跟指针也很像吧~

2.5push_back()

用于在字符串尾部插一个字符

#include<iostream>
using namespace std;
#include<string>
int main()
{
	string s;
	s.push_back('a');
	s.push_back('p');
	s.push_back('p');
	cout<<s<<endl;
	string s2;
	for(char c='a';c<='f';c++)
	{
		s2.push_back(c);
	}
	cout<<s2<<endl;
	return 0;
}

2.6字符串中的+ +=运算

push_back是⽤于在字符串后添加⼀个字符,然⽽部分情况下我们需要向原有的字符串后继续添 加字符串

字符串支持+ +=运算,本质是string中重载了operator这个操作符

#include<iostream>
using namespace std;
#include<string>
int main()
{
	string s="hello ";
	s+="world";
	cout<<s<<endl;
	
	string s1="hello ";
	cout<<s1+"world"<<endl;//s1是不会变的
	
	string s2="hello"
	cout<<"world "+s2<<endl;//可以灵活的拼接在头部或尾部
	return 0;
}

2.7pop_back

用于删除字符串中尾部的一个字符。在C++11标准中引入,有的编译器可能不支持

 int main()
 {
 string s = "hello";
 cout << "s:" << s << endl;
 //尾删
 
s.pop_back();
 cout << "s:" << s << endl;
 //尾删
 
s.pop_back();
 cout << "s:" << s << endl;
 return 0;
 }

但是当字符串中没有字符的时候,再调用这个函数,程序会出现异常,是未定义行为,要避免这么使用

为了避免这种情况,我们可以:

while(s.size() > 0)  //通过size()函数来控制字符串的⻓度
 
{
 s.pop_back();
}

先写到这里~马上更新下面的部分

;