当前课程知识点:程序设计基础(下) > 拓展学习 > C++中的string类 > C++中的string类
C++中的string类
到目前为止涉及到的对字符串的处理是一件比较困难的事情,因为通常在实现字符串的操作时会用到最不容易驾驭的类型——指针。C++标准程序库中提供了一个string类,专门用来处理字符串操作。使用string类操作字符串比之前使用字符型指针char*或字符型数组等操作字符串要方便很多,不必担心内存是否足够、字符串长度等等。string类提供了将字符串作为一种数据类型的表示方法,即可以把 string类看成是C++的一个基本数据类型,能像处理普通变量那样处理字符串。
使用string类,必须在程序中包含头文件string(注意,这里不是string.h,string.h是C字符串头文件)。
1. string类对象的初始化
string类很强大,从string类的构造函数就可以看出。string类的构造函数包括:
n string(); 创建一个默认的string对象,长度为零;
n string(const char *s); 将string初始为一个由s指向的字符串,以'\0'作为结束标识符。
n string(size_type n, char c); 将string初始化一个含有n个字符元素,并且每个字符串元素均为字符c的字符串。
n string(const string &str, size_type n = npos); 将string初始化为对象str中从位置n开始到结尾的字符,npos是表示最大字符串长度的常量。
n string(const char *s, size_type n); 将string对象初始化为s指向的字符串,长度为n,即使遇到了结束符,也要将结束符之后的拷贝过来。
n template <class Iter> string(Iter begin, Iter end); 将string对象初始化为[begin, end]内的字符,其中begin和end的行为就像指针,用于指定位置,范围包括begin在内,但是不包括end。
【例1】string类常用的几种初始化对象的方法。
#include <iostream>
#include <string> //需要包含string头文件,才能使用string类
using namespace std;
int main()
{
char str[] = "C style string";
string s0; //初值为空的字符串对象
string s1("string") //初值为字符串对象
cout<<s1<<endl;
string s2(str); //初值为" C style string "字符串对象
cout<<s2<<endl;
string s3(str,2,3); //初值为从str的第2个字符开始,复制3个字节的字符串,
//即"sty"字符串对象
cout<<s3<<endl;
string s4(s1); //初值为用s1对象初始化的字符串对象, 即"string"
cout<<s4<<endl;
string s5(str,3) //初值为用str前3个字符的字符串对象,即"C s"
cout<<s5<<endl;
string s6(10,'k'); //初值为10个字符'k'的字符串对象,即"kkkkkkkkkk"
cout<<s6<<endl;
return 0;
}
运行结果为:
string
C style string
sty
string
C s
kkkkkkkkkk
2. string类操作
字符串操作函数是C++字符串的重点,下面先把一些常用的成员函数(运算符)罗列出来,然后通过一个简单的例子,让读者进一步了解string操作函数的使用。
n =,assign():赋以新值
n swap():交换两个字符串的内容
n +=,append(),push_back():在尾部添加字符
n insert():插入字符
n erase():删除字符
n clear():删除全部字符
n replace():替换字符
n +:串联字符串
n ==,!=,<,<=,>,>=,compare():比较字符串
n size(),length():返回字符串长度
n max_size():返回字符的可能最大个数
n empty():判断字符串是否为空
n capacity():返回重新分配之前的字符容量
n reserve():保留一定量内存以容纳一定数量的字符
n [ ], at():存取单一字符
n >>,getline():从stream读取某值
n <<:将某值写入stream
n copy():将某值赋值为一个C_string
n c_str():将内容以c_string返回
n data():将内容以字符数组形式返回
n substr():返回某个子字符串
n find():查找函数
【例2】string类的一些常用成员函数(运算符)的使用。
#include <iostream>
#include <string>
using namespace std;
int main()
{
//初始化和赋值
string s1,s2,s3;
s1="The first string"; //使用赋值号赋值
cout<<s1<<endl;
s2.assign("The second string"); //使用assign()函数赋值
cout<<s2<<endl;
s3.assign("123456789",3); //用指定字符串的前3个字符赋值
cout<<s3<<endl;
//swap()交换字符串函数
s1.swap(s2); //交换字符串s1和s2
cout<<"s1="<<s1<<endl;
cout<<"s2="<<s2<<endl;
s2.swap(s1); //再次交换字符串s1和s2
//append(),push_back(),添加字符串函数
s1.append(" is appended with a new string"); //append()方法可以在末尾添加字符串
s2.push_back('!'); //push_back()方法只能在末尾添加一个字符
cout<<s1<<endl;
cout<<s2<<endl;
//insert(),插入函数
s1.insert(0,"begin "); //在头部插入字符串"begin "
s2.insert(s2.size()," end"); //在尾部插入字符串" end"
cout<<s1<<endl;
cout<<s2<<endl;
//erase(),clear(),删除函数
s1.erase(0,6); //从下标0到下标6, 即删除掉了"begin "
s2.erase(s2.length()-4,4); //删除掉了" end "
cout<<s1<<endl;
cout<<s2<<endl;
s3.clear(); //clear() 删除全部字符,s3成空字符串
cout<<s3<<endl;
//replace(),替换函数
s1.replace(4,5,"!!!!!!!!"); //从第5个字符开始的5个的字符替换成"!!!!!!!!"
cout<<s1<<endl;
//==,!=,<,<=,>,>= 比较字符串
s1 = "abcdefg";
s2 = "abcdefg";
if (s1==s2)
cout<<"s1 == s2"<<endl;
s2 = "abcdxyz";
if (s1!=s2)
cout<<"s1 != s2"<<endl;
if (s1>s2)
cout<<"s1 > s2"<<endl;
if (s1<=s2)
cout<<"s1 <= s2"<<endl;
else
cout<<"s1 > s2"<<endl;
//empty(),判断字符串是否为空
if (s3.empty()) //判断字符串是否为空
cout<<"s3 is empty."<<endl;
else
cout<<"s3 is not empty."<<endl;
//重载运算符+和+=实现字符串连接
s3=s3+"ABC"; //字符串拼接
cout<<s3<<endl;
s3+="XYZ"; //字符串拼接
cout<<s3<<endl;
// [ ], at() 存取单一字符
cout<<"use []:"<<endl;
for(int i=0; i<s3.length(); i++) //length()返回字符串长度函数
{
cout<<s3[i]; //取第i个字符
}
cout<<endl;
cout<<"use at():"<<endl;
for(int i=0; i<s3.length(); i++)
{
cout<<s3.at(i); //取第i个字符
}
cout<<endl;
// substr(), 返回某个子字符串
cout<<s3.substr(2,3)<<endl; //返回从s3[2]字符开始的长度为3的子字符串
// find(),查找函数
s3="abcabcabc";
cout<<s3.find("bc",0)<<endl; //从下标0开始,查找第一次出现字符串"bc"的下标
cout<<s3.find("bc",3)<<endl; //从下标3开始,查找第一次出现字符串"bc"的下标
return 0;
}
程序的运行结果如图1所示。
图1 例1的程序运行结果
运算符和函数一样,也可以被重载。string类将常用的运算符重载后,在上面的程序中,使用string类对象就像使用基本数据类型一样方便。上面仅对初学者介绍了string类常用的一些函数或运算符。如果需要用到其他的函数,可以查看C++自带的帮助文件。
-C++的常见错误
--C++的常见错误
-MFC入门
--MFC入门
-STL及使用示例
--STL及使用示例
-算法设计与算法分析基础
-算法设计基本方法与策略基础
-计算机前沿问题思考
-QT编程入门
--QT编程入门
-C++中的string类
-面向对象方法应用实例
-继承与多态应用实例
-排序算法
--排序算法
-C++常见问题汇总
-学习感悟(1)
--学习感悟(1)
-学习感悟(2)
--学习感悟(2)
-学习感悟(3)
--学习感悟(3)
-学习感悟(4)
--学习感悟(4)
-1.1面向对象方法的基本概念
-1.1面向对象方法的基本概念--作业
-1.2 C++中类的定义
-1.2 C++中类的定义
-1.3C++中对象的定义和访问
-1.3C++中对象的定义和访问--作业
-1.4类成员的访问控制
-1.4类成员的访问控制--作业
-1.5析构函数
--1.5析构函数
-1.5析构函数--作业
-1.6拷贝构造函数
-1.6拷贝构造函数--作业
-1.7 类声明与类实现的分离
-1.7 类声明与类实现的分离--作业
-1.8类的静态成员
-1.8类的静态成员--作业
-1.9类的常量成员
-1.9类的常量成员--作业
-1.10this指针
-1.10this指针--作业
-1.11类的友元
--1.11类的友元
-1.11类的友元--作业
-1.12类的对象成员
-1.12类的对象成员--作业
-1.13自定义类的运算符重载
-1.13自定义类的运算符重载--作业
-2.1 派生类的定义和继承方式
-2.1 派生类的定义和继承方式--作业
-2.2 派生类中函数的重定义
-2.2 派生类中函数的重定义--作业
-2.3派生类的构造函数和析构函数
-2.3派生类的构造函数和析构函数--作业
-2.4多继承
--2.4多继承
-2.4多继承--作业
-2.5多态
--2.5多态
-2.5多态--作业
-2.6抽象类
--2.6抽象类
-2.6抽象类--作业
-3.1cout和cin对象及插入和提取运算符
-3.1cout和cin对象及插入和提取运算符--作业
-3.2 使用put和get函数进行标准输出和输入
-3.3使用getline函数进行标准输入
-3.3使用getline函数进行标准输入--作业
-3.4 文件流对象
-3.5文件流对象及插入和提取运算符
-3.5文件流对象及插入和提取运算符--作业
-3.6文件流对象及put、get和getline函数
-3.7按数据块进行输入输出
-3.8按数据块进行输入输出实例
-3.8按数据块进行输入输出实例--作业
-3.9文件的随机读写
-3.9文件的随机读写--作业
-3.10用户自定义数据类型的输入输出
-3.10用户自定义数据类型的输入输出--作业
-4.1函数模板
--4.1函数模板
-4.1函数模板--作业
-4.2类模板
--4.2类模板
-4.2类模板--作业
-5.1数据结构基本概念(一)
-第五章 概论--5.1数据结构基本概念(一)
-5.2数据结构基本概念(二)
-5.2数据结构基本概念(二)--作业
-6.1线性表及其抽象数据类型
-6.1线性表及其抽象数据类型--作业
-6.2顺序表类模板
-6.2顺序表类模板--作业
-6.3顺序表的实现
-6.3顺序表的实现--作业
-6.4简单数据元素顺序表的应用问题
-6.4简单数据元素顺序表的应用问题--作业
-6.5复杂数据元素顺序表的应用问题
-6.5复杂数据元素顺序表的应用问题--作业
-6.6单向链表及其类模板
-6.6单向链表及其类模板--作业
-6.7单项链表的实现(一)
-6.7单项链表的实现(一)--作业
-6.8单项链表的实现(二)
-6.8单项链表的实现(二)--作业
-6.9单向链表的应用
-6.10循环链表及双向链表
-7.1栈及顺序栈
--7.1栈及顺序栈
-7.1栈及顺序栈--作业
-7.2 顺序栈的实现
-7.2 顺序栈的实现--作业
-7.3顺序栈的应用
-7.4 链接栈及其实现
-7.4 链接栈及其实现--作业
-7.5队列及其顺序存储
-7.5队列及其顺序存储--作业
-7.6 顺序循环队列的实现
-7.6 顺序循环队列的实现--作业
-7.7顺序循环队列的应用
-7.8链接队列及其实现
-7.8链接队列及其实现--作业
-8.1树的基本概念
-8.1树的基本概念--作业
-8.2二叉树及其性质
-8.2二叉树及其性质--作业
-8.3二叉树的抽象数据类型和顺序表示
-8.3二叉树的抽象数据类型和顺序表示--作业
-8.4二叉树的链式表示
-第八章 树和二叉树--8.4二叉树的链式表示
-8.5二叉链表的实现(一)
-8.6二叉链表的实现(二)先序和中序遍历
-8.6二叉链表的实现(二)先序和中序遍历--作业
-8.7二叉链表的实现(三)后序和逐层遍历
-8.7二叉链表的实现(三)后序和逐层遍历--作业
-8.8二叉链表的实现(四)
-8.9 二叉排序树
-8.10哈夫曼树和哈夫曼编码
-9.1图的基本概念及其特征
-9.1图的基本概念及其特征--作业
-9.2图的抽象数据类型和表示方式
--Video
-9.2图的抽象数据类型和表示方式--作业
-9.3图的邻接矩阵表示法的实现
-9.3图的邻接矩阵表示法的实现--作业
-9.4图的广度优先遍历
--Video
-9.4图的广度优先遍历--作业
-9.5图的深度优先遍历
-9.5图的深度优先遍历--作业
-9.6图的应用
--9.6 图的应用
-面向对象方法
--面向对象例题讲解
--友元和运算符重载
--对象成员
-继承与多态
--多重继承
--虚函数
--抽象类和纯虚函数
-输入输出流
--输入输出流操作
-模板
--函数模板
--类模板



