C++ STL 基础及应用(5) 字符串

原创 2016年06月03日 12:38:15

本章将介绍 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,',') 即可。

版权声明:本文为博主原创文章,转载请附上原文链接。

相关文章推荐

C++抽象编程——STL实战(5)——map在数据文件查找中的应用

介绍完了数据文件的基本操作,我们就要来试试怎么用STL中的map集合来处理一些文本文档。首先我们来看一道题目:如果你经常飞行,您可以快速了解,世界各机场都有国际航空运输协会(IATA)分配的三字母代码...
  • redRnt
  • redRnt
  • 2017年04月14日 00:14
  • 699

【C++ STL应用与实现】5: 如何使用std::array (since C++11)

本文总结了STL中的序列式容器array的用法及注意事项。array的出现代表着C++的代码更进一步“现代化”,就像std::string的出现代替了c风格字符串并且能和STL配合工作一样,array...
  • elloop
  • elloop
  • 2015年12月24日 00:52
  • 5949

C++ STL 基础及应用(4) 输出输出流

在 C++ 的标准模板库中提供了一组模板类来支持面向对象的数据的输入输出功能,如基本的输入输出流 istream类/ostream类,文件输入输出流 ifstream类/ofstream类/fstre...
  • Raito__
  • Raito__
  • 2016年06月01日 16:25
  • 3754

C++ STL 基础及应用(8) 算法

本章将罗列一下 STL 中常用的算法,包括非变异算法:循环、查询、计数、比较等功能。变异算法:复制、交换、变换、替换、填充、生成、删除、唯一、反转、环移、随机、划分等功能,排序及相关算法,由于大部分算...
  • Raito__
  • Raito__
  • 2016年06月09日 22:27
  • 849

C++ STL 基础及应用(6) 容器

读者可能有这样的经历,自己编写了动态数组类、链表类、集合类和映射类等程序,然后小心地维护着。其实 STL 提供了专家级的几乎我们所需要的各种容器,功能更好,效率更高,复用性更强,所以开发应用系统应该首...
  • Raito__
  • Raito__
  • 2016年06月05日 23:04
  • 2409

C++ STL 基础及应用(1) STL历史、组成和使用方法

本章节主要介绍 STL 的历史和 STL 的基本组成内容,以及使用方法。
  • Raito__
  • Raito__
  • 2016年05月20日 23:55
  • 1045

uva 156 Ananagrams(字符串+STL应用)

uva 156 Ananagrams Most crossword puzzle fans are used to anagrams--groups of words with the ...

请用c++ 实现stl中的string类,实现构造,拷贝构造,析构,赋值,比较,字符串相加,获取长度及子串等功能

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ...
  • szl_lxy
  • szl_lxy
  • 2015年09月09日 12:19
  • 356

c++之STL string(2)复制,迭代,连接,查找,截短,字符串反转,大小写转换

STL string 的常用操作主要有以下五种:复制,迭代,连接,查找,截短; STL string 的常用算法有:字符串反转,大小写转换;...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ STL 基础及应用(5) 字符串
举报原因:
原因补充:

(最多只允许输入30个字)