【C++/STL】string类
程序员文章站
2022-03-23 14:59:27
...
- 简单总结string类相关内容
- string类本身不属于STL库,但是用法上有诸多相似之处,所以也放在STL分类里总结了
文章目录
一、构造函数
- 生成一个空字符串s :
string s;
string str1;
- 初始化为显式字符串:
string s(“value”);
或string s=“value”;
string str1("abc");
string str2="abc"; //str2=str1="abc"
- 拷贝构造函数生成str的副本 :
string s(str);
string str1("abc");
string str2(str1); //str2=str1="abc"
- 初始化为字符串str内 “始于位置stridx” 的部分
string s(str, stridx);
string str1="abcdef";
string str2(s,1); //str2 = "bcdef"
- 初始化为字符串str内"始于stridx且长度最多len"的部分作为字符串的初值
string s(str, stridx, len);
string str1="abcdef";
string str2(str1,1,3); //str2 = "bcd"
- 初始化为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"
- 将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"
- 初始化为连续num个字符
string s(num, char);
string str1(5,'a'); //str1="aaaaa"
- 利用迭代器,初始化为某string串str的一部分
string s(str.begin()+n,str.end()-m);
string str1="abcdef";
string str2(str1.begin()+1,str1.end()-1); //str2="bcde"
- 析构函数,销毁所有字符,释放内存
s.~string();
二、string类的常见操作
(1)对象操作
-
s1+s2
:字符串拼接,返回一个新的string串。左右可以选一边写成显式字符串形式(比如“abc”这样的) -
s1+=s2
:字符串拼接,在s1尾部拼接s2。s2可写成显式字符串形式(没有-=
) -
s1=s2
:s1替换为s2的副本,s2可以写成显式字符串形式 -
s1==s2
:若s1和s2相同,返回true;否则返回false -
>/>=/</<=
:按字典顺序从前往后逐个比较,返回true或false(任意大写字母小于任意小写字母)
(2)string类函数
-
s.empty()
:s为空串返回ture,否则返回false -
s.size()
/s.length()
:返回s中当前字符个数 -
s[n]
/s.at(n)
:返回s中下标为n的字符 -
s.append(str)
:和+=
功能相同 -
s.push_back(c)
:在尾部添加一个字符(不能是字符串,只能是单个字符) -
s.insert()
:-
s.insert(2,"123")
:在下标2位置插入显式字符串“123” -
s.insert(2,str)
:在下标2位置插入string字符串str -
s.insert((string::size_type)0,5,'A')
:在下标0位置插入5个连续的字符’A’
-
-
s.substr()
:-
s.substr()
:返回整个string串 -
s.substr(2)
:返回一个string串,是下标2到结尾部分 -
s.substr(2,3)
:返回一个string串,是下标2到下标2+3部分
-
-
s.erase()
:-
s.erase()
:清空string串,同s.clear() -
s.erase(2)
:清除串中下标2到结尾部分 -
s.erase(2,3)
:清除串中下标2到下标2+3部分
-
-
s.clear()
:清空串 -
s.find()
:-
s.find("abc",2)
:从下标2往后找串“abc”,找到就返回起始字符下标;否则返回string::npos -
s.find("f",2)
:从下标2往后找字符“f”,找到就返回下标;否则返回string::npos
-
-
s.replace()
:-
s.replace(0,2,"REPLACE");
:把下标0到2部分替换为显式字符串 -
s.replace(0,2,str);
:把下标0到2部分替换为string字符串 -
s.replace(s.begin()+n,s.end()-m,str2);
:用迭代器方法选出被替换部分,替换为显式字符串或者string串
-
用迭代器遍历:
basic_string<char>::iterator s_i;
for(s_i=str1.begin();s_i!=str1.end();s_i++)
cout<<*s_i<<" ";
cout<<endl;
(3)更多详细介绍
- string类函数重载十分多,以上没有说全,更详细请参考:标准C++中的string类的用法总结
三、string和char的转换
- string转换成const char*
- 两个成员函数可以实现:
str.c_str()
str.data() - 这两个函数返回一个const char*指针,内容与本string串相同。这是为了与C语言兼容,在C语言中没有string类型
- 一定要使用strcpy()函数等来操作方法c_str()返回的指针
- 两个成员函数可以实现:
string str1 = "Hello World";
const char *ch1 = str1.c_str();
const char *ch2 = str1.data();
-
const char*转string
- string str2(str1.c_str()); //利用string s(cstr)构造函数
- str2 = str1.c_str(); //利用赋值构造函数
-
char*转string
- 同const char *
-
string转char*
- 先转const char*,再强转char*
- 利用str.copy(),注意加\0
char *t=(char*)str1.c_str();
str1.copy(strC,0,4);
strC[5]='\0'; //注意补充'\0'
- char[]转string
- 直接赋值,数组中不需要’\0’
char str[5]={'1','2','3','4','5'}; //不需要'\0'
string str5=str;
- string转char[]
- 遍历一遍,取出每一个字符赋值
四、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;
}
上一篇: JAVA中类型后面跟三个点
下一篇: php怎么删除文件某一行