C++string类总结
初始化|
string(size_type n,char c) | 创建一个包含n个元素的string对象,其中每个元素都初始化为c |
---|---|
string(const string &str) | 复制构造函数 |
string(const char *s,size_type n) | 将string初始化为s指向的前n个字符 |
string(Iter begin,Iter end) | 将string对象初始化为区间[begin,end)里面的字符 |
string() | 创建一个默认的string对象,长度为0 |
string(const char * s) | 将string对象初始化为s指向的字符串的最大长度 |
string(const string &str,string size_type pos=0,size_type n=npos) | 将一个string对象初始化为对象str从位置pos开始到结尾的字符,或从位置pos开始的n个字符 |
string str1("jinnian shujia buac");//
string str2(20, '$');//20个$
string str3(str1);//str3=str1
char str4[] = "mingnian shujia ac";
string str5(str4, 10);//mingnian s str4的前十个
string str6(str4 + 4, str4 + 10);//nian s //str4的 下标0开始 [4,10)
string str7(&str4[4], &str4[10]);
string str8(str1, 2, 3);//nni 下标2开始三个
string str9;
str9=str1+str2;
下面是输出的结果
jinnian shujia buac
$$$$$$$$$$$$$$$$$$$$
jinnian shujia buac
mingnian shujia ac
mingnian s
nian s
nian s
nni
jinnian shujia buac$$$$$$$$$$$$$$$$$$$$
string类输入
对于c风格的字符串有三种输入方式`
char str[100];
cin>>str;//读取一个单词
cin.getline(str,100);//读取一行 遗弃换行符
cin.get(str,100);//读取一行 留下换行符
对于string对象,有两种方式
string str;
cin>>str;
getline(cin,str);//读取一行 遗弃换行符
第三个参数 可以用来确定输入的边界
我们用读取到s结束为例(读取到s的前一个字符,不会读取到s)
cin.getline(str,100,'s');
getline(cin,str,'s');
如果在输入队列中输入xixi hahasda
str=xixi haha;
长度
length()和size()都可以返回string的长度
length()成员来自较早版本的string类,而size()则是为提供STL兼容性
而添加的
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main() {
string str,str1;
str = "abcdefg";
cout << str.size() << endl;
cout << str.length() << endl;
return 0;
}//输出结果为两个7
find方法的四个版本
string::pos 是字符串可存储的最大字符数,通常是无符号int或者无符号long的最大取值
原型: size_type find(const string &str,size_type pos=0)const;
find(const string &str,pos=0)const | 从字符串的pos位置开始,查找子字符串str。如果找到,则返回该字符串首次出现时首字母的索引;否则,返回string::pos
原型: size_type find(const char *s,size_type pos=0)const;
find(const string &str,pos=0)const | 从字符串的pos位置开始,查找子字符串s。如果找到,则返回该字符串首次出现时首字母的索引;否则,返回string::pos
原型: size_type find(const char *s,size_type pos=0,size_type n)const;
从字符串的pos位置开始,查找s的前n个字符组成的子字符串。如果找到,则返回该子字符串首次出现其首字母的索引;否则返回string::pos
原型:size_type find(char ch,size_type pos=0)const;
从字符串的pos位置开始,查找字符ch。如果找到,则返回该字符首次出现的位置;否则返回string::pos
上代码
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main() {
string str,str1;
str = "abcdefg";
str1 = "cd";
char str2[] = "cd";
char str3[] = "dc";
char ch = 'd';
cout << str.find(str1, 0) << endl;//cd第一次出现的位置
cout << str.find(str2, 0) << endl;//cd第一次出现的位置
cout << str.find(str3, 0) << endl;//找不到
cout << str.find(ch, 0) << endl;//e第一次出现的位置
return 0;
}
输出结果为
2
2
4294967295
3
string库还提供了相关的方法:
rfind()
find_first_of()
find_last_of()
find_first_not_of()
find_last_not_of()
重载方法和find()类似
rfind()
查找子字符串或字符最后一次出现的位置
find_first_of()
在字符串中查找参数中任何一个字符首次出现的位置
find_first_not_of()
在字符串中查找第一个不包含在参数中的字符
find_last_of()
在字符串中查找参数中任何一个字符最后一次出现的位置
find_last_not_of()
在字符串中查找最后一个不包含在参数中的字符
代码
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main() {
string str,str1;
str = "abcdba";
cout << str.rfind('a') << endl; //返回最后一个a的位置
cout << str.find_first_of('a')<<endl; //返回第一个a的位置
cout << str.find_first_not_of("acb")<<endl; //返回d的位置
cout << str.find_last_of('b') << endl; //返回第一个b的位置
cout << str.find_last_not_of('a') << endl; //返回最后一个b的位置
return 0;
}
输出:
5
0
3
4
4
比较方法和函数
string类提供了用于比较2个字符串的方法和函数,下面是方法的原型
int compare(const basic_string &str) const noexcept
int compare(size_type pos1,size_type n1,const basic_string &str) const
int compare(size_type pos1,size_type n1,const basic_string &str,size_type pos2,size_type n2) const
int compare(const charT* s)const
int compare(size_type pos1,size_type n1,const charT * s)const
int compare(size_type pos1,size_type n1,const charT* s,size_type n2)const;
如果第一个字符串位于第二个字符串之前,则第一个方法返回一个小于0的值,如果这两个字符串相同,则将返回0,如果第一个字符串位于第二个字符串的后面。则他将返回一个大于0的值
如果较长的字符串和较短的前半部分与较短的字符串相同。则较短的字符串位于较长的字符串之前。
#include<iostream>
using namespace std;
int main() {
string s1 = ("babyiloveyou");
string s2 = ("baby");
string s3 = ("woxihuanni");
cout << s1.compare(s2) << endl;
cout << s1.compare(s3) << endl;
return 0;
}
输出结果
1
-1
第二个方法和第一个方法类似,但是进行比较时,只使用第一个字符串从pos开始的n个字符
#include<iostream>
using namespace std;
int main() {
string s1 = ("babyiloveyou");
string s2 = ("baby");
cout << s1.compare(0, 4, s2) << endl;
return 0;
}
输出结果 0
第三个方法使用第一个字符串从pos1开始的n1个字符和第二个字符串从pos2开始的n2个字符比较。
#include<iostream>
using namespace std;
int main() {
string s1 = ("babyiloveyou");
string s2 = ("ilove");
cout << s1.compare(5, 4, s2,1,4) << endl;
return 0;
}
输出结果 0
修改方法
+=在系统中已经被重载可以直接使用。
append()方法可以将一个字符串追加到另一个字符串的后面。
#include<iostream>
#include<string>
using namespace std;
int main() {
string s1("woxihuan");
string s2("ni");
cout << s1 << endl;
s1.append(s2);
cout << s1 << endl;
s1.append(3, '!');
cout << s1 << endl;
return 0;
}
输出结果
woxihuan
woxihuanni
woxihuanni!!!
string类还提供了assign方法
assign 如果第三个参数为空,默认从第二个参数一直到字符串最后一个字符
#include<iostream>
#include<string>
using namespace std;
int main() {
string s2;
string s1("woxihuanni");
s2.assign(s1,1, 3);//s2下标为1开始的3个赋值给s2
cout << s2 << endl;
s2.assign(3, 's');//s2为 sss
return 0;
}
插入方法
string str1("iyou");
str1.insert(0,"love");//str1为iloveyou
cout << str1 << endl;
替换方法
string str1("iloveyou");
str1.replace(1, 4, "xihuan");//str1为ixihuanyou
cout << str1 << endl;//第一个参数代表初始下标 第二个代表替换原串的长度
使用find()来查找需要replace()的位置:
string str1("i love you face");
string str2("you");
string str3("she");
string::size_type pos = str1.find(str2);
if (pos != string::npos)
str1.replace(pos, str2.size(), str3);
cout << str1 << endl;
str1最后会是“i love she face”
其他
copy()方法将string对象或其中的一部分复制到指定的字符数组中:
size_type copy(charT* s,size_type n,size_type pos=0) const;
警告:copy()方法不追加空值字符,也不检查目标数组的长度是否够用
其中,s指向目标数组,n是要复制的字符数,pos指出从string对象的什么位置开始复制,直到复制了n个字符或者达到string对象的最后一个字符。
swap()方法用一个时间恒定的算法来交换两个string对象的内容。
void swap(basic_string& str);