字符串构造
string s; //生成一个空字符串s
string s(str) //拷贝构造函数 生成str的复制品
string s(str, stridx) //将字符串str内"始于位置stridx"的部分当作字符串的初值
string s(str, stridx, strlen) //将字符串str内"始于stridx且长度顶多strlen"的部分作为字符串的初值
string s(cstr) //将cstr字符串作为s的初值
string s(chars, chars_len) //将C字符串前chars_len个字符作为字符串s的初值。
string s(num, c) //生成一个字符串,包含num个c字符
string s(beg, end) //以区间beg;end(不包含end)内的字符作为字符串s的初值
string访问
*(str.begin() + i )等价于 str[i] ;
通过迭代器遍历
for(string::iterator it = str.begin(); it!= str.end(); it++){
printf("%c",*it);
}
string成员函数
1.length()和size()
size()与length()完全等同,遇到空字符不会被截断,可以返回字符串真实长度。
C++ string类的size()和length()的返回值是无符号数,在写程序的时候将一个int型数值与其返回值比较时,应注意可能出现的问题!
在有符号整型和无符号整型的比较中,自动将有符号整型数转换为无符号整型。
当进行int型与size()、length()返回值比较时,特别要注意返回值进行相关运算后可能出现的负数,这时将会发生类型转换。
2. 两个string类可以用== != < <= > >=比较,规则是字典序。
3.insert()
str.insert(pos,string);在pos位置插入字符串string
str.insert(it,it2,it3); 在it位置插入[it2,it3)
4.erase()
str.erase(it);
str.erase(first,last);删除[first,last)
str.erase(pos,length);pos是开始删除字符的起始位置 ;length未删除字符个数
5.substr(pos,len)
从pos位置开始获取长度len的字串。
pos的默认值是0,len的默认值是str.size() - pos;
所以str.substr()获取str;
str.substr(i),获取从i开始直到str结束的字符串。
6.find()
string::pos 是一个常数,其值是-1,但由于是unsigned_ind类型,所以可以认为是unsigned_int类型的最大值。
所以 return string::pos > 0 是false 因为进行无符号数比较。
str.find(sstr2)
str.find(str2,pos);从str的pos位置找str2,找到返回第一次出现的位置,
找不到返回string::pos
rfind()招最后一一个匹配的位置。用法和find相似。
7.replace()
basic_string& replace( size_type pos, size_type count,
const basic_string& str,
size_type pos2, size_type count2 = npos );
basic_string& replace( size_type pos, size_type count,
size_type count2, CharT ch );
basic_string& replace( const_iterator first, const_iterator last,
size_type count2, CharT ch );
basic_string& replace( const_iterator first, const_iterator last,
const basic_string& str );
basic_string& replace( size_type pos, size_type count,
const basic_string& str,
size_type pos2, size_type count2 );
参数
pos 将被替换的子串起始位置
count 将被替换的子串长度
first, last 将被替换的字符范围
str 用于替换的 string
pos2 用于替换的子串起始位置
count2 用于替换的字符数
ch 用于替换的字符值
first2, last2 用于替换的字符范围
8.其他函数
添加字符 append() push_back();
清空字符串 clear()
改变字符数量 resize()
str.at(i) 等价于 str[i]
c_str() 将内容以C-string返回
data()将内容以字符数组返回
stringstream字符流
包含在头文件< sstream>
istringstream类用于执行C++风格的串流的输入操作。
ostringstream类用于执行C++风格的串流的输出操作。
stringstream类同时可以支持C++风格的串流的输入输出操作。
构造:
stringstream ss(s);
你可以把ss当成cin和cout来使用!
如果你打算在多次转换中使用同一个stringstream对象,记住再每次转换前要使用clear()方法;
在多次转换中重复使用同一个stringstream(而不是每次都创建一个新的对象)对象最大的好处在于效率。stringstream对象的构造和析构函数通常是非常耗费CPU时间的。
自己搞的也不是特别懂的代码:
#include<iostream>
#include<sstream>
using namespace std;
int main(){
string s = "8 9";
stringstream ss(s);
string str;
ss>>str;
cout<<str<<endl;
ss>>str;
cout<<str<<endl;
ss.clear();
ss<<16;
ss<<15;
cout<<ss.str();
输出:
8
9
1615
}
常见处理
1.用空格分割字符串
#include<sstream>
istringstream ss(s);
while(ss>>str){
process(str);
}
2.翻转字符串
int n = str.size();
for(int i = 0; i < n/2; i++){
swap(str[i],str[n-1-i]);
}
或者借用reverse(str.begin(),str.end()) (algorithm头文件)
3.字符串与其它类型转换
① to_string() 返回值的十进制表示的字符串
to_string(0xaf) 是字符串"175"(16进制前缀是0x,八进制是0)
② 使用stringstream 整型(十进制)转字符串(十进制表示 ,八进制表示,十六进制表示)
整型转字符串:
#include<iostream>
#include<sstream>
using namespace std;
int main(){
stringstream ss;
int i = 11;
string str;
ss<<i;
ss>>str;
cout<<ss.str()<<endl;
cout<<str<<endl;
}
整型转字符串(八进制与十六进制表示):
#include<iostream>
#include<sstream>
using namespace std;
int main(){
stringstream ss;
int i = 11;
string str;
ss<<hex<<i;
ss>>str;
cout<<str<<endl;
ss.clear();
ss<<oct<<i;
ss>>str;
cout<<str;
}
字符串转整型:
#include<iostream>
#include<sstream>
using namespace std;
int main(){
stringstream ss;
int i ;
string str = "a";
ss<<hex<<str;
ss>>i;
cout<<i<<endl;
ss.clear();
}
我们可以定义两个通用的模板
其他类型转字符串转:与 任意两种类型进行转换
#include<iostream>
#include<sstream>
using namespace std;
template<class T>
void to_string(string & result,const T& t)
{
ostringstream oss;//创建一个流
oss<<t;//把值传递如流中
result=oss.str();//获取转换后的字符转并将其写入result
}
template<class out_type,class in_value>
out_type convert(const in_value & t)
{
stringstream stream;
stream<<t;//向流中传值
out_type result;//这里存储转换结果
stream>>result;//向result中写入值
return result;
}
int main(){
string res;
to_string(res, 10.5);
cout<<res;
double d;
string salary;
string s="12.56";
d=convert<double>(s);//d等于12.56
cout<<d;
salary=convert<string>(9000.0);//salary等于”9000”
cout<<salary;
}
③ itoa 与 atoi
char *itoa (int value, char *str, int base );
返回值:返回指向str的指针,无错误返回。
int value 被转换的整数,char *string 转换后储存的字符数组,int radix 转换进制数,如2,8,10,16 进制等,大小应在2-36之间。
int atoi(const char *nptr);
atol
atof
atoll也可以使用。
4.字符串的二进制转换的一般方法
对于八进制十六进制可以用3.的方法
一般可以转换成int,然后用除基取余法,再转回字符串。
5.字符串的公共前缀
一个比较容易理解的思路(代码量小)就是将字符串按字典序排序,然后求解第一个字符串和最后一个字符串的公共前缀就是所有字符串的公共前缀。(时间上并不优秀)
6.字符串加法
7.子序列与子串
子序列是指一个字串中非连续的字串,例如:字串A:123456789 它有一个子序列a:13579(非连续) 它有一个子串b:12345(连续)。
8.字典树
9.字符串hash
10.大小写转换
大写字母:upper case
小写字母: lower case
ASCII码表大小写字母差32 ‘A’ + 32 == ‘a’;
11.读入带空格的字符串
对于字符数组
cin.getline(str,len);
cin.get(str,len);
当然,还有C语言学习的时候都知道的gets
gets()的一些注意点:gets读取一行,但是gets读取’\n’时会把’\n’转换为’\0’,用于结束,所以gets读入的数组中是不会有换行符的。最重要的是gets不安全,以为不判断是否溢出。
对于string类
getline(cin,str)