欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【C++/STL】string类

程序员文章站 2022-03-23 14:59:27
...
  • 简单总结string类相关内容
  • string类本身不属于STL库,但是用法上有诸多相似之处,所以也放在STL分类里总结了

一、构造函数

  1. 生成一个空字符串s :string s;
string str1;
  1. 初始化为显式字符串:string s(“value”);string s=“value”;
string str1("abc");
string str2="abc";	//str2=str1="abc"
  1. 拷贝构造函数生成str的副本 :string s(str);
string str1("abc");
string str2(str1);	//str2=str1="abc"
  1. 初始化为字符串str内 “始于位置stridx” 的部分string s(str, stridx);
string str1="abcdef";
string str2(s,1);	//str2 = "bcdef"
  1. 初始化为字符串str内"始于stridx且长度最多len"的部分作为字符串的初值 string s(str, stridx, len);
string str1="abcdef";
string str2(str1,1,3);	//str2 = "bcd"
  1. 初始化为C字符串cstr,没有\0的char数组可以完整赋值,若有则到\0为止 string s(cstr);
char cstr1[5]={'1','2','3','\0','5'};
char cstr2[5]={'1','2','3','4','5'};
string str1(cstr1);		//str1 = "123"
string str2(cstr2);		//str2 = "12345"
  1. 将C字符串cstr的前len个字符作为字符串s的初值。 \0会变成空格 string s(cstr, len);
char cstr1[5]={'1','2','3','\0','5'};
char cstr2[5]={'1','2','3','4','5'};
string str1(cstr1,5);	//str1 = "123 5"
string str2(cstr2,5);	//str2 = "12345"
  1. 初始化为连续num个字符 string s(num, char);
string str1(5,'a');		//str1="aaaaa"
  1. 利用迭代器,初始化为某string串str的一部分string s(str.begin()+n,str.end()-m);
string str1="abcdef";
string str2(str1.begin()+1,str1.end()-1);	//str2="bcde"
  1. 析构函数,销毁所有字符,释放内存 s.~string();

二、string类的常见操作

(1)对象操作

  1. s1+s2:字符串拼接,返回一个新的string串。左右可以选一边写成显式字符串形式(比如“abc”这样的)
  2. s1+=s2:字符串拼接,在s1尾部拼接s2。s2可写成显式字符串形式(没有-=
  3. s1=s2:s1替换为s2的副本,s2可以写成显式字符串形式
  4. s1==s2:若s1和s2相同,返回true;否则返回false
  5. >/>=/</<=:按字典顺序从前往后逐个比较,返回true或false(任意大写字母小于任意小写字母

(2)string类函数

  1. s.empty():s为空串返回ture,否则返回false
  2. s.size() / s.length():返回s中当前字符个数
  3. s[n] / s.at(n):返回s中下标为n的字符
  4. s.append(str):和+=功能相同
  5. s.push_back(c):在尾部添加一个字符(不能是字符串,只能是单个字符
  6. s.insert()
    1. s.insert(2,"123"):在下标2位置插入显式字符串“123”
    2. s.insert(2,str):在下标2位置插入string字符串str
    3. s.insert((string::size_type)0,5,'A'):在下标0位置插入5个连续的字符’A’
  7. s.substr()
    1. s.substr():返回整个string串
    2. s.substr(2):返回一个string串,是下标2到结尾部分
    3. s.substr(2,3):返回一个string串,是下标2到下标2+3部分
  8. s.erase()
    1. s.erase():清空string串,同s.clear()
    2. s.erase(2):清除串中下标2到结尾部分
    3. s.erase(2,3):清除串中下标2到下标2+3部分
  9. s.clear():清空串
  10. s.find()
    1. s.find("abc",2):从下标2往后找串“abc”,找到就返回起始字符下标;否则返回string::npos
    2. s.find("f",2):从下标2往后找字符“f”,找到就返回下标;否则返回string::npos
  11. s.replace()
    1. s.replace(0,2,"REPLACE");:把下标0到2部分替换为显式字符串
    2. s.replace(0,2,str);:把下标0到2部分替换为string字符串
    3. s.replace(s.begin()+n,s.end()-m,str2);:用迭代器方法选出被替换部分,替换为显式字符串或者string串
  12. 用迭代器遍历:
	basic_string<char>::iterator s_i;
	for(s_i=str1.begin();s_i!=str1.end();s_i++) 
		cout<<*s_i<<" ";
	cout<<endl;

(3)更多详细介绍

三、string和char的转换

  1. string转换成const char*
    1. 两个成员函数可以实现:
      str.c_str()
      str.data()
    2. 这两个函数返回一个const char*指针,内容与本string串相同。这是为了与C语言兼容,在C语言中没有string类型
    3. 一定要使用strcpy()函数等来操作方法c_str()返回的指针
string str1 = "Hello World";
const char *ch1 = str1.c_str();
const char *ch2 = str1.data();
  1. const char*转string

    1. string str2(str1.c_str()); //利用string s(cstr)构造函数
    2. str2 = str1.c_str(); //利用赋值构造函数
  2. char*转string

    1. 同const char *
  3. string转char*

    1. 先转const char*,再强转char*
    2. 利用str.copy(),注意加\0
	char *t=(char*)str1.c_str();
	
	str1.copy(strC,0,4);
	strC[5]='\0';		//注意补充'\0'
  1. char[]转string
    1. 直接赋值,数组中不需要’\0’
	char str[5]={'1','2','3','4','5'};	//不需要'\0'
	string str5=str;
  1. string转char[]
    1. 遍历一遍,取出每一个字符赋值

四、sstream

  • sstream库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。
  • sstream使用string对象来代替字符数组。这样可以避免缓冲区溢出的危险。而且,传入参数和目标对象的类型被自动推导出来,即使使用了不正确的格式化符也没有危险。
  • sstream主要用于:
    1. 字符串分割 (按空格分割)
    2. 数据类型转换

(1) sstream对象的初始化:

·用构造函数
	string str="1234";
	stringstream ss(str);	
·用流
	stringstream ss,ss2;		
  	ss<<1<<2.3<<'A'<<str; 								//可以输入各种形式的数据,
	ss>>str;											//再输出为string就能把这一串都转为一个string 
		
	ss2<<123<<ss;
	ss2>>str;											//这里用流作为输入,转str输出会时,ss部分会拼接为其地址 
	cout<<str<<endl; 

(2) 数据类型转换

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

//利用流将各类型数据转换为string 
template<class T>
void to_string(string &result,const T& t)
{
	ostringstream oss;	//创建一个流
	oss<<t;				//把值传递如流中
	result=oss.str();	//获取转换后的字符转并将其写入result
} 

//利用流将任意类型转换为任意类型 
template<class out_type,class in_value>
out_type convert(const in_value &t)
{
	stringstream stream;
	stream<<t;			//向流中传值
	out_type result;	//这里存储转换结果
	stream>>result;		//向result中写入值
	return result;
}

int main()
{
	//直接转换
	stringstream stream;
	string result="12345";	
	int n=0;
	stream<<result;
	stream>>n;			//n=12345
	cout<<n<<endl;

	//利用流将各类型数据转换为string
	to_string<int>(result,123);		cout<<result<<endl;
	to_string<float>(result,12.3);	cout<<result<<endl;
	to_string<char>(result,'A');	cout<<result<<endl;
	to_string<bool>(result,true);	cout<<result<<endl;

	//利用流将任意类型转换为任意类型 
	int a=convert<int,double>(3.14);		cout<<a<<endl;
	char b=convert<char,int>(69);			cout<<b<<endl;
	float c=convert<float,string>("12.3");	cout<<c<<endl;
}
  • 在做类型转换的时候,最好重复利用一个sstream流,因为构造这个对象比较慢
    但是要注意两次转换直接必须调用stream.clear(); 这会清除标志位,保证转换正确
    但是只调用 stream.clear(); 并没有释放strem占用的内存(可以调用stream.str().length()查看),还要调用一下stream.str(""); 来释放空间,这样在多次使用时也不会有问题
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main()
{
	//stream.clear(); 和 stream.str(""); 	
	stringstream stream;
	int a,b;
 
	stream<<"80";
	stream>>a;
	cout<<"Size of stream = "<<stream.str().length()<<endl;
 
	stream.clear();		//注意 
//	stream.str(""); 	//这句很关键,观察这句话在注释和不注释情况下的输出区别

	cout<<"Size of stream = "<<stream.str().length()<<endl;

	stream<<"90";
	stream>>b;

	cout<<"Size of stream = "<<stream.str().length()<<endl;
 
 	cout<<a<<endl;
 	cout<<b<<endl;
 
	system("PAUSE ");
}

(3) 字符串分割

  • sstream可以利用空格符号进行自动分割,就像用cin输入时遇到空格会打断一样
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main()
{
	string line,substr;
	cout<<"输入带空格的字符串:"; 
	getline(cin,line);
	
	stringstream ss(line);  //用getline读取的一行数据创建一个“字符串流” SS 。
	while(ss >> substr) 	//用空格分割子串输出
 		cout<<substr<<endl;
	
	return 0;
}