【C++/STL】1. string类

  • 简单总结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
    3. 注意:如果找不到会返回 string::npos ,判断时要用这个来判断!
  11. s.find_last_of():从后往前查找
    1. s.find_last_of("0123",9):从下标9往前查找串“0123”中和s重合部分(和find不同),找到就返回最后一个重合部分的最后一个字符下标;(举例:如果str=“0123456789”,调用s.find_last_of("##012AB456CD",9),会返回6)
    2. s.find_last_of(‘0’,9):从下标9往前查找字符‘0‘,返回第一个找到字符下标
    3. 注意:如果找不到会返回 string::npos ,判断时要用这个来判断!
  12. 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串
    4. s.replace(0,1,5,' ');:把下标0到下标0+1部分换成5个‘ ’空格
    5. s.replace(str.begin()+2,str.begin()+4,1,' ');把下标2到下标4部分换成1个‘ ’空格
  13. 用迭代器遍历:
	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*
char *t=(char*)str1.c_str();
  1. char[]转string
    1. 直接赋值,数组中不需要’\0’
char str[5]={'1','2','3','4','5'};	//不需要'\0'
string str5=str;
  1. string转char[]
    1. 遍历一遍,取出每一个字符赋值
    2. size_type copy( char *str, size_type num, size_type index );copy()函数拷贝自己的num个字符到str中(从索引index开始)。返回值是拷贝的字符数,注意这样是没有‘\0’的
char data[100];
string str="0123456789";
	
str.copy(data,10,0);	//data[0]~data[9]为'0'~'9'

四、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;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云端FFF

所有博文免费阅读,求打赏鼓励~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值