String
读取
- cin读取在空格处停止读取
- getline()可以读取一整串
操作
-
插入:s.insert(pos,args) 在pos之前插入args指定的字符。pos可以是一个下标或一个迭代器。接受下标的版本返回一个指向s的引用;接受迭代器的版本返回指向第一个插入字符的迭代器 ——s.insert(插入位置,对象字符,插入位置,插入字符个数) -
删除:s.erase(pos,len) ——s.erase(删除位置起点,删除字符个数) -
复制:s.assign(args) 将s中的字符替换为args指定的字符。返回一个指向s的引用 ——s.assign(复制对象,复制起点,复制字符个数) -
替换:s.replace(range,args) 删除s中范围range内的字符,替换为args指定的字符。range或者是一个下标和一个长度,或者是一对指向s的迭代器。返回一个指向s的引用 s.replace(2,3,“haha”)//将s中下标2开始的3个字符替换成“haha” ——s.replace(替换起点,替换字符个数,替换内容); -
末尾插入:s.append(args) 把args追加到s,返回一个指向s的引用 ——s.append(替换内容)
搜索操作
搜索成功则返回一个表示发生位置下标的迭代器
搜索失败则返回一个const string::npos 的static成员,并初始化值为-1
- s.find(args)——查找s中args第一次出现的位置
- s.rfind(args)——查找s中args最后一次出现的位置
- s.find_first_of(args)——查找s中args任何一个字符第一次出现的位置
- s.find_last_of(args)——查找s中args任何一个字符最后一次出现的位置
- s.find_first_not_of(args)——查找s中第一个不在args的字符
- s.find_last_not_of(args)——查找s中最后一个不在args的字符
- s.find(args,pos)——pos代表查找开始的位置
比较操作——compare()函数
s1.compare(s2):简单的将s1与s2进行比较
s1.compare(pos1,n1,s2):将s1中从pos1开始的n1个字符与s2进行比较
区别于strcmp
- 实现的效果是相同的,等于返回0,大于返回正数,小于返回负数
- 但是strcmp需要对字符数组进行操作,因为会有默认的’\0’符
#include<iostream>
#include<cstring>
using namespace std;
int main(){
string numbers("0123456789"),name("r2d2");
auto a=strcmp(numbers.c_str(),name.c_str());
auto b=numbers.compare(name);
cout<<a<<" "<<b<<endl;
}
成员函数
-
子串——substr #include<iostream>
#include<cstring>
using namespace std;
int main(){
string s1("Hello world"),s2;
s2=s1.substr(4,5);//表示从下标4开始5个字符
cout<<s2<<endl;//o wor;
}
-
交换函数——swap string s1("Hello world"),s2("really");
s1.swap(s2);
cout<<s1<<endl;//really
cout<<s2<<endl;//Hello world
-
转换函数——转换成c语言是char *字符串 //s1.c_str()返回传统的const char* 类型字符串,而且该字符串以’\0’结尾 -
转换函数——转换成c语言是char *字符串 s1.data()返回的是非静态的char* 类型字符串,即可修改 #include<iostream>
#include<cstring>
using namespace std;
int main(){
string numbers("0123456789"),name("r2d2");
auto a=strcmp(numbers.data(),name.data());
auto b=numbers.compare(name);
cout<<a<<" "<<b<<endl;
}
示例
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
void replace_string(string &s,const string &oldval,const string &newval){
auto l=oldval.size();
if(!l){
return;
}
auto iter =s.begin();
while(iter<=s.end()-1){//少于oldval长度的部分无需检查
auto iter1=iter;
auto iter2=oldval.begin();
//s中iter开始的子串必须每个字符都与oldval相同
while(iter2!=oldval.end()&& *iter1==*iter2){
iter1++;
iter2++;
}
if(iter2==oldval.end()){//oldval耗尽——字符串相等
iter=s.erase(iter,iter1);//删除s中与oldval相等的部分
if(newval.size()){//替换子串是否为空
iter2=newval.end();//由后至前逐个插入newval中的字符
do{
iter2--;
iter=s.insert(iter,*iter2);
}while(iter2>newval.begin());
}
iter+=newval.size();//迭代器移动到新插入的内容之后;
}else iter++;
}
}
int main(){
string s="tho thru tho! thru thru thu thru";
replace_string(s,"thru","through");
cout<<s<<endl;
replace_string(s,"tho","though");
cout<<s<<endl;
replace_string(s,"through"," ");
cout<<s<<endl;
return 0;
}
|