C++之string
目录
前言
string是C++标准库的一个重要的部分,主要用于字符串处理。可以使用输入输出流方式直接进行操作,也可以通过文件等手段进行操作。同时C++的算法库对string也有着很好的支持,而且string还和c语言的字符串之间有着良好的接口。虽然也有一些弊端,但是瑕不掩瑜。
基本操作
1)头文件
#icnlude < string >
2)声明
string s;//声明一个string 对象
string ss[10];//声明一个string对象的数组
3)初始化
使用等号的初始化叫做拷贝初始化,不使用等号的初始化叫做直接初始化。
string s;//默认初始化,一个空字符串
string s1("ssss");//s1是字面值“ssss”的副本
string s2(s1);//s2是s1的副本
string s3=s2;//s3是s2的副本
string s4(10,'c');//把s4初始化
string s5="hiya";//拷贝初始化
string s6=string(10,'c');//拷贝初始化,生成一个初始化好的对象,拷贝给s6
//string s(cp,n)
char cs[]="12345";
string s7(cs,3);//复制字符串cs的前3个字符到s当中
//string s(s2,pos2)
string s8="asac";
string s9(s8,2);//从s2的第二个字符开始拷贝,不能超过s2的size
//string s(s2,pos2,len2)
string s10="qweqweqweq";
string s11(s10,3,4);//s4是s3从下标3开始4个字符的拷贝,超过s3.size出现未定义
4)特性描述
str.size(); //返回当前字符串的大小
str.length(); //返回当前字符串的长度
str.empty(); //当前字符串是否为空,空则返回true
5)push_back(),在尾部添加字符
string str1("abc");
str1.push_back('d'); //字符串之后插入一个字符,str1="abcd"
6)substr操作
//s.substr(pos1,n)返回字符串位置为pos1后面的n个字符组成的串,假如目标串不够这些字符,则最多就只有这些字符
string s2=s.substr(1,5); //bcdef
//s.substr(pos)//得到一个pos到结尾的串
string s3=s.substr(4); //efg
假如目标串不够这些字符,则最多就只有这些字符
string s2=s.substr(1,5); //bcdef
//s.substr(pos)//得到一个pos到结尾的串
string s3=s.substr(4); //efg
7)insert操作
string str="to be question";
string str2="the ";
string str3="or not to be";
string::iterator it;
//s.insert(pos,str)//在s的pos位置插入str
str.insert(6,str2); // to be the question
//s.insert(pos,str,a,n)在s的pos位置插入str中插入位置a到后面的n个字符
str.insert(6,str3,3,4); // to be not the question
//s.insert(pos,cstr,n)//在pos位置插入cstr字符串从开始到后面的n个字符
str.insert(10,"that is cool",8); // to be not that is the question
//s.insert(pos,cstr)在s的pos位置插入cstr
str.insert(10,"to be "); // to be not to be that is the question
//s.insert(pos,n,ch)在s.pos位置上面插入n个ch
str.insert(15,1,':'); // to be not to be: that is the question
//s.insert(s.it,ch)在s的it指向位置前面插入一个字符ch,返回新插入的位置的迭代器
it = str.insert(str.begin()+5,','); // to be, not to be: that is the question
//s.insert(s.it,n,ch)//在s的it所指向位置的前面插入n个ch
str.insert (str.end(),3,'.'); // to be, not to be: that is the question...
//s.insert(it,str.ita,str.itb)在it所指向的位置的前面插入[ita,itb)的字符串
str.insert (it+2,str3.begin(),str3.begin()+3); // to be, or not to be: that is the question...
8)erase操作
// string.erase(pos, n) 删除从pos开始的n个字符
string::iterator i;
string s="abcde";
s.erase(1, 2); //ade
//string.erase(pos) 删除pos处的一个字符(pos是string类型的迭代器)
string::iterator i;
string s = "abcde";
i = s.begin() + 3;
s.erase(i); //abce
//string.erase(first,last) 删除从first到last中间的字符(first和last都是string类型的迭代器)
string::iterator i;
string s = "abcde";
s.erase(s.begin() + 1, s.end() - 1); //a
9)append操作
string str;
string str2 = "Writing ";
string str3 = "print 10 and then 5 more";
//直接追加一个str2的字符串
str.append(str2); // "Writing "
//后面追加str3第6个字符开始的3个字符串
str.append(str3, 6, 3); // "10 "
//追加字符串形参的前5个字符
str.append("dots are cool", 5); // "dots "
//直接添加
str.append("here: "); // "here: "
//添加10个'.'
str.append(10u, '.'); // ".........."
//添加str3迭代器范围的字符串
str.append(str3.begin() + 8, str3.end()); // " and then 5 more"
//最后这个比较特殊,意思是添加5个'A',实际上参数里面的65对应的asc码就是65
str.append<int>(5, 65); // "....."
//字符串追加也可以用重载运算符实现
str += "lalala";
std::cout << str << '\n
10)assign操作
string str;
string base = "The quick brown fox jumps over a lazy dog.";
// used in the same order as described above:
//直接把base赋值给str
str.assign(base);
std::cout << str << '\n';
//把base第10个字符以及后面的8个字符赋给str
str.assign(base, 10, 9);
std::cout << str << '\n'; // "brown fox"
//把参数中的0到6个字符串赋给str
str.assign("pangrams are cool", 7);
std::cout << str << '\n'; // "pangram"
//直接使用参数赋值
str.assign("c-string");
std::cout << str << '\n'; // "c-string"
//给str赋值10个'*'字符
str.assign(10, '*');
std::cout << str << '\n'; // "**********"
//赋值是10个'-'
str.assign<int>(10, 0x2D);
std::cout << str << '\n'; // "----------"
//指定base迭代器范围的字符串
str.assign(base.begin() + 16, base.end() - 12);
cout << str << '\n'; // "fox jumps over"
11)compare操作
和strcmp函数一样,如果两个字符串相等,那么返回0,调用对象大于参数返回1,小于返回-1。
在compare当中还支持部分比较,里面有6个参数可以设置。
string s1 = "123", s2 = "123";
cout << s1.compare(s2) << endl;//0
s1 = "123", s2 = "1234";
cout << s1.compare(s2) << endl;//-1
s1 = "1234", s2 = "123";
cout << s1.compare(s2) << endl;//1
12)连接操作
cout << "方式1:" << endl;
string s1 = "123";
string s2 = "456";
s1 += s2;
cout << "s1 = " << s1 << endl; //123456
cout << "方式2:" << endl;
string s3 = "123";
string s4 = "456";
s3.append(s4);
cout << "s3 = " << s3 << endl; //123456