多功能的string.
string的本质
模板类
string类的函数:
string和容器很像,
函数 | 作用 |
begin() | |
end() | |
push_back() | 注意string没有push_front() |
back() | |
front() | |
to_string() | 不是string成员函数,可以转换正数,负数,小数。 |
stoi(),stof()... | 小数,负数也可以正常转换 |
反转 | string没有内置的reverse函数。反转有两种方式: 1,reverse(); 2,str.assign(str.rbegin(), str.rend()); 3,s.assign(str.rend(),str.rbegin());为什么会段错误,rend()是第一个元素之前的位置,无。 |
push_back(char) | 注意:只能push字符,不能字符串 |
append(string) | 这个才能string |
iterator insert(iterator,char) | |
size_t find(arg) | arg可以是字符或者字符串 |
string的构造函数
1,string(char*)
2,string(std::string)
3,string(char*,int len)
第二个参数表示从起始的长度。
#include <iostream>
int main(){
const char *c_str="abcdefgggg";
std::string str=std::string(c_str,3);
std::cout<<str<<std::endl;
return 0;
}
4,string(std::string,int index)
第二个参数表示复制的开始索引,到最后。
#include <iostream>
int main(){
const char* cc="abcdefghijk";
std::string c_str=std::string(cc,3);
std::cout<<c_str<<std::endl;
std::string str="abcdefghijk";
std::string later_str=std::string(str,3);
std::cout<<later_str<<std::endl;
std::string pre_str=std::string(str.c_str(),3);
std::cout<<later_str<<std::endl;
return 0;
}
如何比较两个string字符串:
1,string类可以用关系运算符进行比较:
比较的原则是:ASCII码大者为大 ,小写字母大于大写字母
string str1="vdufbvf",s1="yhhhhuu";
string str2="iwufvbdfv",s2="Yhhhuu";
if(str1>str2)
cout<<"str1>str2"<<endl;
else if(str1<str2)
cout<<"str1<str2"<<endl;
if(s1>s2)
cout<<"s1"<<s1<<endl;
else if(s1<s2)
cout<<"s2"<<s2<<endl;
2,
string类的compare函数:
compare返回0,1,-1
compare的参数可以是以下类型:
string str1="come here,dear.";
string str2="ok,I am going now.";
str2.compare(str1);// 1
str2.compare("you are late.");// 2
str2.compare(4,4,str1);// 3,将str2从4开始的4个字符与str1比较
str2.compare(4,4,str1,3,4);// 4,将str2从4开始的4个字符与str1从3开始的4个字符比较
char arr[]="oehdfcbfc";
str2.compare(arr);// 5
str2.compare(2,4,arr);// 6,原理同3
str2.compare(3,5,arr+n,4);// 7,将str2从3开始的5个字符和arr+n的地址开始的4个字符比较
如何从一个string字符串中抽取出需要的字符串:
substr函数:
string str="We will not seperate forever";
string s=str.substr(0);//拷贝str中的所有字符
string s=str.substr(3);//从w(注意小写的w)考试拷贝所有字符
string s=str.substr(5,10);//从地址为5个的地址拷贝10个字符
//当开始拷贝位置加上计数值大于str时,substr只会拷贝到结尾
//当开始拷贝的位置大于str的最大字节数时,程序报错
string的数值转换:
1,其他类型转string:
int n=10;
string s=to_string(n);
注意:to_string只能运用于任何算数类型,而不能用于char,char会变为Int再转伟string
string str("1982");
int num=stoi(str);
stoi会将数字字符之后的非数字字符除去,前面的不会。
如何将char转为string
string中保存的就是char
string str;
str.push_back('a');
头文件
注意头文件----#include <string>
不是string.h也不是cstring
那么如何将char类型转为string:
可以用string的构造方法:
其中要转换为数值的string对象中的第一个字符必须是数字
p,b参数可以不要,只要s.
如何判断string对象是否为空:
string类的empty函数:
string s;
s.empty();
empty函数返回一个bool类型
对string源对象字符串进行插入,删除,元素访问:
(如何连接字符串)
at(int index)
元素的访问可以用下标,或者at()函数,at()的参数也是下标。
replace
`std::string` 类型的 `replace()` 成员函数有三个版本:
1. `string& replace (size_t pos, size_t len, const string& str)`:
在字符串中从 `pos` 开始的 `len` 个字符会被替换为 `str`。
#include <iostream>
int main(){
std::string str="I am an animal.";
std::cout<<str<<std::endl;
std::string animal="animal";
if(str.find("animal")!=std::string::npos){
int index=str.find(animal);
str.replace(index,animal.size(),"person");
std::cout<<str<<std::endl;
}
return 0;
}
2. `string& replace (iterator first, iterator last, const string& str)`:
将半开区间 `[first, last)` 内的字符替换为 `str`,其中 `first` 和 `last` 都是 `string` 类型的迭代器。
#include <iostream>
int main(){
std::string str="I am an animal.";
std::cout<<str<<std::endl;
std::string animal="animal";
if(str.find("animal")!=std::string::npos){
int index=str.find(animal);
str.replace(str.begin()+index,str.begin()+index+animal.size(),"person");
std::cout<<str<<std::endl;
}
return 0;
}
3. `string& replace (size_t pos, size_t len, const char* s)`:
在字符串中从 `pos` 开始的 `len` 个字符会被替换为 C 风格的字符串 `s`。
怎么替换所有目标字符串
string的replace只能替换一次,替换所有需要循环。
#include <iostream>
int main(){
std::string str="aa bb cc aa aa";
std::cout<<str<<std::endl;
std::string re="aa";
while(str.find(re)!=std::string::npos){
int index=str.find(re);
str.replace(index,re.size(),"--");
}
std::cout<<str<<std::endl;
return 0;
}
string的find函数
find有两个参数,第二个参数为开始查询的下班位置,默认为0.
string s = "hello world!";
cout << s.find("l",5) << endl;
string的三个erase
非迭代器erase:
两个参数都是size_t类型,返回指向新字符串是字符串引用。
迭代器erase(两个):
所有的参数都是erase,返回迭代器。
int和char的用'0'转换
int和char之间的转换,无非就是ASCLL码的转换。
其他的数字字母的ASCLL码都是‘0’的ASCLL码加上1,所以:
'0'的ASCLL码为48
char ch=1+'0'; //48+1=49;所以ch='1';
int num=ch-'0';//49-48=1,所以num=1;
stringstream
本质
stringstream本质上是一个从输入输出继承而来的流。
有参数的构造函数和无参构造函数的调用区别
1,无参构造---之后添加的字符串都不会覆盖拼接;
2,有参构造---之后添加的字符串会覆盖构造时的字符串,但是注意,之后添加的所有字符串并不会覆盖,而是会拼接。
作用:
1,以空格作为默认分割字符串;
2,按照指定字符分割字符串;
默认空格分割字符串
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main() {
string str = "1 left 2";
stringstream ss(str);
int num1, num2;
string c;
ss >> num1 >> c >> num2; // 从 stringstream 中依次读取整数和字符
cout << "num1 = " << num1 << endl;
cout << "num2 = " << num2 << endl;
cout << "c = " << c << endl;
return 0;
}
指定特定字符分割
#include <iostream>
#include <sstream>
int main(){
std::string str{"a,b,c,d"};
std::stringstream ss{str};
std::string member;
while(getline(ss,member,',')){
std::cout<<member<<std::endl;
}
return 0;
}
stringstream进行小数精度输出
四舍五入
#include <iostream>
#include <sstream>
#include <iomanip>
int main(){
std::stringstream ss;
double f=1.11161;
ss<<std::fixed<<std::setprecision(3)<<f;
std::cout<<ss.str()<<std::endl;
return 0;
}
从字符串中提取单词
#include <iostream>
#include <regex>
#include <string>
int main() {
std::string content = "const int variable1 [10]; const char var2 [100]";
std::regex r("(const\\s+)(\\w+\\s+)(\\w+[0-9]+\\s+)");
const std::sregex_iterator end;
for (std::sregex_iterator iter(content.begin(), content.end(), r); iter!=end; iter++)
{
std::cout << "(*iter)[0]=" << (*iter)[0]<< std::endl;
std::cout << "iter->str="<<iter->str() << std::endl;
std::string res=iter->str();
std::stringstream ss(res);
std::string con,var,name;
ss>>con>>var>>name;
std::cout<<con<<var<<name<<std::endl;
}
return 0;
}