一、啥叫string类?
string类是由头文件< string >支持的(注意,头文件< string.h >和< cstring >
支持对C风格字符串进行操纵的C库字符串函数,但不支持string类)。
string类包含大量的方法,其中包括了若干构造函数、用于将字符串赋给变量、合并字符串、比较字符串和访问各个元素的重载运算符以及用于在字符串中查找字符和子字符串的工具等。总之,string类包含的内容很多。
二、构造函数
- 基本操作
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str; //构造名为str的空字符串
cout<<str<<endl;//检测为空
string str1("i like");//为字符串str1赋值
cout<<str1<<endl;
str1=str1+" ACM"; //在str1后面添加字符串
cout<<str1<<endl;
string str2(str1);//将字符串str2初始化为str1,相当于复制
cout<<str2<<endl;
string str3(10,'A'); //将str3初始化为由10个A组成的字符串
cout<<str3<<endl;
string str4("Kobe Byrant",4); //访问前四个元素
string str5("Kobe Byrant",5,6);//访问从第五个开始往后的6个元素
cout<<str4<<" "<<str5<<endl;
}
运行结果:
- 重载[ ]运算符
通过下标运算输出指定元素,注意范围。
string str=("Kobe Byrant");
cout<<str4[0]<<str4[1]<<str4[2]<<str4[3];
结果为:
也可输出单个字符:
- 字符串相加
string s;
s=str1+str2;
cout<<s;
结果为:
- 复制C风格字符串
char alls[] = "You can really dance!";
string str6(alls,22);
cout<<str6;
结果为:
- 判断字符串是否为空
string str,str1;
cout<<str.empty()<<endl;
str1="hello world!";
cout<<str1.empty()<<endl;
若为空,则返回1,非空返回0
三、string类输入
对于C风格,有三种输入方式:
char s[100];
cin>>s;
cin.getline(s,100);
cin.get(s,100);
对于string对象,有两种方式:
string str;
cin>>str;
getline(cin,str);
四、string库函数
- 字符串长度:
length();
string s("To be or not to be");
cout<<s.length();
- 字符个数:
size();
string s("To be or not to be");
cout<<s.size();
以上这两个函数完成相同的任务。
- 容量
如果字符串不断增大,超过了内存块的大小,程序将分配一个大小为原来两倍的新内存块,以提供足够大的空间,避免不断地分配新的内存块。
(1)capacity();
返回当前分配给字符串的内存块的大小
//输出内存大小
string s("To be or not to be");
cout<<s.capacity();
结果是23.
(2)reserve();
让操作者能够请求内存块的最小长度,也就是将容量变大,但不能变小。
//修改内存大小
s.reserve(50);//如果输入s.reserve(17),也就是小于原来的18,容量值还是18
cout<<s.capacity()<<endl;
结果是50.
- 重新设置字符个数:
resize();
s.resize(8);
cout<<s.capacity()<<endl;
cout<<s.length()<<endl;
cout<<s.size()<<endl;
cout<<s<<endl;
容量大小未变,字符长度改变。
- 输出/修改单个字符函数:
at();
输出
string s("To be or not to be");
cout<<s.at(1)<<endl;
结果是o
修改
string s("To be or not to be");
s.at(1)='t';
cout<<s.c_str()<<endl;
o被换成t
- 输出全部字符:
c_str
string s1="That is a question";
cout<<s1.c_str();
- 插入函数
(1)任意位置插入:insert();
s1.insert(0," ");
cout<<s1<<endl;
此处插入了多个空格。
(2)末尾插入/添加:append();
s.append(s1);
cout<<s<<endl;
输出结果是
- 指定函数:
assign();
s1.assign("what are you saying",5);
cout<<s1<<endl;
输出前五个字符。
- 比较字符串大小:
compare();
(1)整串比较
string str1="abcd";
string str2="bcdefg";
cout<<str1.compare(str2)<<endl;
//整体比较
//如果str1>str2,返回 1,str1=str2返回 0 ,str1<str2返回 -1.下同
(2)部分与整串比较
string str1="abcd";
string str2="cdefg";
cout<<str1.compare(1,2,str2)<<endl;
//str1的前两个与str2比较
(3)部分与部分比较
string str1="abcd";
string str2="cdefg";
cout<<str1.compare(1,2,str2,1,2)<<endl;
//str1的前两个与str2的前两个比较
- 复制函数:
copy();
将对象中的某部分复制进一个字符数组内:
char a[10]={0};
str1.copy(a,4,0);
//4表示选取的个数,0是位置下标
cout<<a<<endl;
结果为abcd
- 查找函数:
find();
(1)查找子串
cout<<(int)s.find("question")<<endl;
cout<<(int)s.find(s1,2)<<endl;
// //若找到返回子串第一个元素的下标
//没有找到返回-1
(2)查找字符
cout<<(int)s.find('t')<<endl;
//返回第一个被找到的元素下标
//未找到返回-1
- 返回子串函数:
substr();
cout<<s.substr(38,46);
//返回38~46之间的子串
//输出结果为question
- 删除字符:
erase;
s.erase(18,8);
//删除从第18个元素开始的8个字符
cout<<s<<endl;
- 替换字符:
replace;
s.replace(0,2,"To");
cout<<s<<endl;
//把0~2的字符替换为 “To"
五、string库函数整体代码实现
#include<iostream>
#include<string>
using namespace std;
int main()
{
cout<<"求串的长度和大小:\n";
string s("To be or not to be!!!!!");
cout<<s.length()<<endl;
cout<<s.size()<<endl;
cout<<"\n";
cout<<"求容量:\n";
cout<<s.capacity()<<endl;
cout<<"\n";
cout<<"扩容:\n";
s.reserve(50);
cout<<s.capacity()<<endl;
cout<<"\n";
cout<<"修改容量:\n";
s.resize(18);
cout<<s.capacity()<<endl;
cout<<s.length()<<endl;
cout<<s.size()<<endl;
cout<<s<<endl;
cout<<"\n";
cout<<"输出/修改单个字符:\n";
cout<<s.at(1)<<endl;
s.at(1)='O';
cout<<s.c_str()<<endl;
cout<<"\n";
cout<<"全输出:\n";
string s1="That is a question";
cout<<s1.c_str();
cout<<"\n";
cout<<"任意位置插入:\n";
s1.insert(0," ");
cout<<s1<<endl;
cout<<"\n";
cout<<"末尾插入:\n";
s.append(s1);
cout<<s<<endl;
cout<<"\n";
cout<<"指定输出:\n";
string s2;
s2.assign("what are you saying",5);
cout<<s2<<endl;
cout<<"\n";
cout<<"比较函数:\n";
string str1="abcd";
string str2="cdefg";
cout<<str1.compare(str2)<<endl;
cout<<"\n";
cout<<"复制函数:\n";
char a[10]={0};
str1.copy(a,4,0);
cout<<a<<endl;
cout<<"\n";
cout<<"查找函数:\n";
cout<<(int)s.find("question")<<endl;
cout<<(int)s.find(s1,2)<<endl;
cout<<"\n";
cout<<"查找字符:\n";
cout<<(int)s.find('t')<<endl;
cout<<"\n";
cout<<"返回子串:\n";
cout<<s.substr(38,46);
cout<<"\n";
cout<<"删除部分子串:\n";
s.erase(18,8);
cout<<s<<endl;
cout<<"\n";
cout<<"最终结果为:\n";
s.replace(0,2,"To");
cout<<s<<endl;
}
输出结果为:
续上
string函数还有很多,今后边学习边积累