string基本字符系列容器
- STL提供了string基本字符系列容器来处理字符串,可以把string理解为字符串类,它提供了添加、删除、替换、查找和比较等丰富的方法。
- 向量的元素类型可以是string,如vector这样的向量,实际上就类似于C语言中的字符串数组。
- 使用string容器,需要头文件包含声明“ #include ”
基本使用
创建string对象
- 创建一个字符串对象s, s是一个空字符串,其长度为0:
string s;
获取字符串长度 s.length( )
给string对象赋值
- 直接给字符串对象赋值
s="hello,wakaka";
- 把字符指针赋给一个字符串对象
string s; char ss[5000]; //scanf的输入速度比cin快得多 //scanf是C语言的函数,不支持string对象 scanf("%s", ss); //把整个字符数组赋值给string对象 s=ss;
#include<iostream> using namespace std; int main(){ string s1,s2; char c[20]; s1="hello,wakaka"; scanf("%s",c); s2=c; cout<<s1.length()<<endl; cout<<s2.length()<<endl; return 0; }
在字符串对象尾部添加字符
- 使用 + 操作符即可
s=s+'b';
s=s+"123";
- 使用append()方法
s.append("abc");
#include<iostream> using namespace std; int main(){ string s; s="hello,wakaka"; s=s+"123"; s.append("abc"); cout<<s<<endl; return 0; }
//定义迭代器 string::iterator it; //迭代器位置为字符串首 it=s.begin(); //把字符’p’插入到第1个字符前(注意,字符位置是从0开始计数) s.insert(it+1, 'p');
访问string对象的元素
- 使用下标方式随机访问string对象的元素,下标是从0开始计数的
string对象的元素是一个字符(char)
s[0];
删除string对象的元素
- 清空一个字符串,则直接给它赋空字符串即可。
- 使用erase()方法删除迭代器所指的那个元素或一个区间中的所有元素。
- 左闭右开 [ )
#include<iostream> using namespace std; int main(){ string s; s="hello,wakaka"; s.erase(s.begin(),s.begin()+2); cout<<s<<endl; return 0; }
返回string对象的长度
- 采用length()方法可返回字符串的长度
- 采用empty()方法,可返回字符串是否为空,如果字符串为空,则返回逻辑真,即1,否则,返回逻辑假,即0。
s.length(); s.empty();
替换string对象的字符
- 使用replace()方法可以很方便地替换string对象中的字符
string s; s="abc123456"; //从第3个开始,将连续的3个字符替换为“good” //即将“123”替换为“good” s.replace(3,3, "good");
搜索string对象的元素或子串
- 采用find()方法可查找字符串中的第一个字符元素(char,用单引号界定)或者子串(用双引号界定),如果查到,则返回下标值(从0开始计数),如果查不到,则返回4294967295(一个很大的数)。
string s; s="cat dog cat"; //查找第一个字符‘c',返回下标值 s.find('c'); //查找第一个子串“c”,返回下标值 s.find("c");
string对象的比较
- string对象可与使用compare()方法与其他字符串相比较。如果它比对方大,则返回1;如果它比对方小,则返回-1;如果它与对方相同(相等),则返回0。
s.compare("cat")
用reverse反向排序string对象
- 采用reverse()方法可将string对象迭代器所指向的一段区间中的元素(字符)反向排序。
- 声明头文件“#include ”
reverse(s.begin(), s.end());
string对象作为vector元素
- 类似于字符串数组
vector<string> v;
string类型的数字化处理
- 将读入的数字的每位分离出来,如果采用取余的方法,花费的时间就会太长,这时候,我们可以将读入的数据当成字符串来处理。
//计算输入整数数据的每位的和 string s; cin>>s; int num; for(int i=0;i<s.length();i++){ num+=s[i]-48; } cout<<s<<endl; cout<<"sum:"<<num<<endl;
string对象与字符数组互操作
- 字符数组ss赋值线字符串对象s
s=ss;
- 采用c_str()方法
s.c_str();
- c_str()函数声明: const char* c_str();
- c_str()函数返回一个指向c字符串的指针,内容与本string串相同。
- c中没有string类型,必须通过string类对象成员函数c_str()把string对象转换成c中的字符串。
- 要通过strcpy()函数等来操作c_str()返回的指针。
strcpy(c,s.c_str());
- c_str()返回的是一个分配给const char*的地址,其内容已经设定为不可变更,如果把此地址赋给一个变更内容的char*变量,就会冲突。
//使用printf()不需要格式控制字符串,也可以直接输出目标字符串 char a[10]="aaaa"; printf(a);
string对象与sscanf函数
- sscanf函数,可以把一个字符串按需要的方式分离出子串,甚至是数字。
//将字符串分离成子串,分隔符为空格,分割后的子字符数组,可以赋值给string容器对象 sscanf("abc 123 pc", "%s %s %s", sa, sb, sc); //将字符串分离成数字,分隔符为空格 //当用到数字的时候,跟scanf一样,它要传指针地址 int a, b, c; sscanf("1 2 3", "%d %d %d", &a, &b, &c); //将字符串分离成数字,分隔符为“,”和“$” //当用到数字的时候,跟scanf一样,它要传指针地址 int x, y, z; sscanf("4,5$6", "%d, %d$%d", &x, &y, &z);
string对象与数值相互转换
- 将数值转换为string的第一种方法sprintf()
char a[10]; string s; sprintf(a, "%d",1975); //赋值给string对象 s=a; cout<<s<<endl;
- C++方法:将数值转换为string
使用ostringstream、istringstream类要包含头文件
string convertToString(double x) { ostringstream o; if (o << x) return o.str(); return "conversion error"; //if error } //C++方法:将string转换为数值 double convertFromString(const string &s) { istringstream i(s); double x; if (i >> x) return x; return 0.0; //if error }