C++ STL 基础及应用(5) 字符串
来源:互联网 发布:云数据库怎么使用 编辑:程序博客网 时间:2024/06/08 02:16
本章将介绍 STL 中字符串相关的操作,包括插入、替换、删除、比较、查询。
STL string 类提供了强大的功能,使得许多繁琐的编程内容用简单的语句即可完成。
string 字符串类减少了 C/C++ 编程中三种最常见并且造成严重后果的错误:
1.数组越界。
2.通过未被初始化或者被赋值错误的指针来访问数组元素。
3.以及在释放了某一数组原先所分配的存储单元后仍保留的"悬挂"指针。使用 STL string 类时需要头文件 <string>。
字符串创建及初始化
基本创建方式和迭代器创建方式代码如下:#include <iostream>#include <string>using namespace std;int main () {string s0; //使用默认构造函数初始化,此时s0为空,长度为0,不是随机值string s1="How"; //通过赋值来初始化string s2("are"); //通过构造函数初始化string s3(s1); //通过构造函数初始化string s4=s2; //通过赋值初始化string s5=s1+" "+s2+" you?"; //组合赋值string s6(s5,0,s5.length()); //通过构造函数初始化string s7(s6.begin(),s6.end()); //通过向构造函数传递两个迭代器来初始化cout<<s7;return 0;}注意!切记保证自己导入了头文件 <string> ,否则会有语句错误,因为 <iostream> 中对 string 类编写有限,读者可自行去掉 #include<string> 来查看编译错误。
插入操作
#include <iostream>#include <string>using namespace std;int main () {string s1="Fine!";s1.append("Thank");s1.insert(s1.size()," you!");cout<<s1;return 0;}append() 在字符串末尾添加。
insert(int n,string s) 插入函数,参数 n 为插入位置。
size() 返回字符串长度,字符串 string 类本身可以根据需要自动调整字串所在的内存空间大小。
替换操作
#include <iostream>#include <string>using namespace std;int main () {string s="Goodbye world!";s.replace(0,7,"Hello");cout<<s;return 0;}replace(int m,int n,string s) 第一个参数为替换开始位置,第二个参数为删除几个字符,s为插入的字符。
删除操作
#include <iostream>#include <string>using namespace std;int main () {string s="Hello world! hahaha";s.erase(12,7);//也可以用迭代器作为参数//s.erase(s1.begin()+12,s1.begin()+7);cout<<s;int p;cin>>p;return 0;}erase() 第一个参数为开始删除位置,第二个参数为删除字符个数
比较操作
#include <iostream>#include <string>using namespace std;int main () {string s1="aaa";string s2="abc";string s3(s1);cout<<(s1>s2);cout<<(s1==s3);return 0;}由于 STL 中直接重载了 operator==、operator!=、operator>、operator<、operator>=、operator<=,因此直接用这些运算符比较即可。字符串的比较规则为从前往后依次比较字符的 ASCII 大小。
注意!这段代码中的 cout<<(s1==s3) 打印的是1,读者可以用 cout<<&s1<<&s3 来查看,会发现 s1 与 s3 被分配与不同内存位置,STL 重载的 operator== 只比较 string 对象中的字符串是否一致,而不用比较两个对象是否一致(即为同一对象)。
查询操作
string::npos 这是 string 类中的一个成员变量,一般用于字符串查询函数的返回值上,若返回值等于该值,则表明没有符合查询条件的结果值。find() 返回第一个与指定字符串匹配的位置。
find_first_of() 返回第一个与指定字符串中任意字符匹配的位置。
find_last_of() 返回最后一个与指定字符串中任意字符匹配的位置。
find_first_not_of() 返回第一个与指定字符串中任意字符不匹配的位置。
find_last_not_of() 返回最后一个与指定字符串中任意字符不匹配的位置。
rfind()
上述函数为两个参数时,第一个参数表示待查询子串,第二个参数表示查询开始位置。当为一个参数时,第二个参数默认为0。上述函数没有找到时都返回 string::npos 。
字符串查询代码示例:
#include <iostream>#include <string>using namespace std;int main () {string s="Hello World!";cout<<s.find("World")<<" ";cout<<s.find_first_of("l")<<" ";cout<<s.find_first_of("l",5)<<" ";cout<<s.find_first_not_of("l")<<" ";cout<<s.find_last_of("l")<<" ";cout<<s.find_last_not_of("l");return 0;}输出:
6 2 9 0 9 11
接下来给出两个使用 STL 实现字符串分割的代码,读者可以比较学习。
基于查询函数实现字符串分割
#include <iostream>#include <string>using namespace std;int main () {string s="How are you?";string separator=" ";int prepos=0;int pos=0;string result;while((pos=s.find_first_of(separator,pos)) != string::npos) //查询空格位置{result=s.substr(prepos,pos-prepos); //找到一个子串cout<<result<<endl;pos++;prepos=pos;}if(pos!=s.size()) //判断有无最后一个子串{result=s.substr(prepos,pos-prepos);cout<<result<<endl;}return 0;}
基于 istringstream 实现字符串分割
#include <iostream>#include <string>#include <sstream>using namespace std;int main () {string s="How are you?";string result;istringstream sin(s);while(!sin.eof()){sin>>result;cout<<result<<endl;}return 0;}巧妙地将静态字符串封装成了 istringstream 对象,变为动态,再通过提取符动态拆分字符串。这种“静态-动态”的思维在实际编程中经常用到。但是如果想用 "," 或者其他分隔符分割字符串怎么办?很简单,只需要将 sin>>result 改为 getline(sin,result,',') 即可。
0 0
- C++ STL 基础及应用(5) 字符串
- C++STL基础及应用第27页
- 《C++ STL基础 及应用》笔记
- C++ STL 基础及应用(0) 目录
- C++ STL 基础及应用(3) 迭代器
- C++ STL 基础及应用(6) 容器
- C++ STL 基础及应用(8) 算法
- C-字符串应用(5)
- C++ STL 基础及应用(4) 输出输出流
- C++ STL 基础及应用(7) 函数对象(仿函数)
- C++STL基础与应用(第95页)
- C++STL技术原理浅析与应用基础之vector
- C++STL字符串
- C++ STL 基础及应用(1) STL历史、组成和使用方法
- C++STL基础
- STL-set,map基础应用
- C语言中的字符串截取函数及应用
- C语言中的字符串截取函数及应用
- 卡特兰数——generate-parentheses 打印成对的括号
- 使用WKWebView替换UIWebView
- 汇编学习(十)8086汇编拾遗 (9)
- 使用ifstream和getline读取文件内容
- scala学习之偏函数与闭包
- C++ STL 基础及应用(5) 字符串
- HashTable浅析_算法艺术
- 【每周一文】Convolutional Neural Network for text/sentence classification(2016)
- Android(线程二) 线程池详解
- GEEK编程练习— —发糖果问题
- Linux 多服务器间文件拷贝
- Html(10) - get和post方法的区别
- Hash碰撞与拒绝服务攻击
- Android中使用的数据单位