在C++中相较C语言多了一个很重要的数据类型,那就是string,接下来我们看看string的特点及使用。
string类:可以把string看成是一个特殊的容器,里面装的是字符
#include <iostream>
#include <map>
using namespace std;
int main()
{
string str1="yesterday once more";
string str2("my hear will go on");
string str3(str1,6);
string str4(str1,6,3);
char ch_music[]={"Roly-Poly"};
string str5=ch_music;
string str6(ch_music);
string str7(ch_music,4);
string str8(10,'i');
string str9(ch_music+5,ch_music+9);
cout<<"str1="<<str1<<endl;
cout<<"str2="<<str2<<endl;
cout<<"str3="<<str3<<endl;
cout<<"str4="<<str4<<endl;
cout<<"str5="<<str5<<endl;
cout<<"str6="<<str6<<endl;
cout<<"str7="<<str7<<endl;
cout<<"str8="<<str8<<endl;
cout<<"str9="<<str9<<endl;
return 0;
}
2.赋值、拼接字符串
string 重载了= + +=等多种运算符,让字符串组合拼接更简单
#include <iostream>
#include <map>
using namespace std;
int main()
{
string str="a woman appreciates";
string str2=" a man who can make her laugh ";
string strlove=str+str2;
cout<<"strlove="<<strlove<<endl;
str.push_back('!');
cout<<"str="<<str<<endl;
str.append("-阿拉丁");
cout<<"str="<<str<<endl;
str.assign("dreams come true");
cout<<"str="<<str<<endl;
str.insert(16,"!!!");
cout<<"str="<<str<<endl;
return 0;
}
3.访问字符操作
string 可以按数组方式,以下标来访问,还可以用at()函数访问指定的字符
#include <iostream>
#include <map>
using namespace std;
int main()
{
string str="iphone 7";
cout<<str[2]<<endl;
cout<<str.at(5)<<endl;
string stuff;
getline(cin,stuff);
cout<<"stuff="<<stuff<<endl;
getline(cin,stuff,'!');//输入一行字符,赋值给stuff,以'!'结束
cout<<"stuff="<<stuff<<endl;
return 0;
}
4.可以把string理解成一个特殊的容器,可以使用STL接口
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string str;
str.push_back('Q');
str.push_back('A');
str.push_back('B');
string::iterator itstr=str.begin();
for(;itstr!=str.end();itstr++)
cout<<*itstr<<" ";
cout<<endl;
sort(str.begin(),str.end());//排序
for(itstr=str.begin();itstr!=str.end();itstr++)
cout<<*itstr<<" ";
cout<<endl;
return 0;
}
最后我们来自己编写一个my string类。
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
class String
{
public:
// String s1 ; String s1("qwerty");
String(const char *str=NULL);//默认构造函数
String(const String &str);//复制构造函数
~String();//析构函数
String operator+(const String &str);//字符串连接
String &operator=(const String &str);//字符串赋值
bool operator==(const String &str);//判断是否字符串相等
int Length();//获取字符串长度
friend ostream &operator<<(ostream &o,const String &str);//重载输出运算符<<
String Sonstr(int begin,int end);//获取子字符串(begin...end-1)
private:
char *addstr;
};
String::String(const char *str)
{
if(str==NULL)//String s1;
{
addstr=new char[1];
addstr[0]='\0';
}
else// String s1("qwertyu")
{
addstr=new char[strlen(str)+1];
strcpy(addstr,str);
}
}
//String s2(s1);
String::String(const String &str)
{
addstr=new char[strlen(str.addstr)+1];
strcpy(addstr,str.addstr);
}
String::~String()
{
delete [] addstr;
}
//s3=s1+s2
String String::operator+(const String &str)
{
String res;
delete[] res.addstr; //释放原有的空间
res.addstr=new char[strlen(addstr)+strlen(str.addstr)+1];
strcpy(res.addstr,addstr);
strcpy(res.addstr+strlen(addstr),str.addstr);
return res;
}
//s2=s1
String &String::operator=(const String &str)
{
if(addstr==str.addstr)
return *this;
delete [] addstr;
addstr=new char[strlen(str.addstr)+1];
strcpy(addstr,str.addstr);
return *this;
}
//s2==s1
bool String::operator==(const String &str)
{
return strcmp(addstr,str.addstr)==0;
}
//s2 strlen(s2);
int String::Length()
{
return strlen(addstr);
}
//cout<<str<<endl;
ostream &operator<<(ostream &o,const String &str)
{
o<<str.addstr;
return o;
}
//s1="qwertyu"
// 3 6 4 6-3+1 新空间下标 :0 1 2 3
String String::Sonstr(int begin,int end)
{
String res;
delete [] res.addstr; //释放原有空间
res.addstr=new char[end-begin+1];//重新申请内存
for(int i=0;i+begin<end;i++)
res.addstr[i]=addstr[begin+i];
res.addstr[end-begin]='\0';
return res;
}
int main()
{
String s1="abcd";
String s2="abcd";
cout<<s1<<(s1==s2?"==":"!=")<<s2<<endl;
String s3="hello";
String s4="world";
cout<<s3+s4<<endl;
cout<<(s3+s4).Sonstr(2,7)<<endl;
return 0;
}