string 类是 STL 中 basic_string 模板实例化得到的模板类。其定义如下: typedef basic_string
string;

basic_string 此处可以不必深究。

string
类的成员函数有很多,同一个名字的函数也常会有五六个重载的版本。篇幅所限,不能将这些原型一一列出并加以解释。这里仅对常用成员函数按功能进行分类,并直接给出应用的例子,通过例子,读者可以基本掌握这些成员函数的用法。

要想更深入地了解 string 类,还要阅读 C++ 的参考手册或编译器自带的联机资料。对于前面介绍过的字符串处理的内容,这里不再重复说明。

1. 构造函数

string 类有多个构造函数,用法示例如下:

string s1();  // si = ""
string s2("Hello");  // s2 = "Hello"
string s3(4, 'K');  // s3 = "KKKK"
string s4("12345", 1, 3);  //s4 = "234",即 "12345" 的从下标 1 开始,长度为 3 的子串

为称呼方便,本教程后文将从字符串下标 n 开始、长度为 m 的字符串称为“子串(n, m)”。

string 类没有接收一个整型参数或一个字符型参数的构造函数。下面的两种写法是错误的:

string s1('K');
string s2(123);

2. 对 string 对象赋值

可以用 char* 类型的变量、常量,以及 char 类型的变量、常量对 string 对象进行赋值。例如:

string s1;
s1 = "Hello";  // s1 = "Hello"
s2 = 'K';  // s2 = "K”

string 类还有 assign 成员函数,可以用来对 string 对象赋值。assign 成员函数返回对象自身的引用。例如:

string s1("12345"), s2;
s3.assign(s1);  // s3 = s1
s2.assign(s1, 1, 2);  // s2 = "23",即 s1 的子串(1, 2)
s2.assign(4, 'K');  // s2 = "KKKK"
s2.assign("abcde", 2, 3);  // s2 = "cde",即 "abcde" 的子串(2, 3)

3. 求字符串的长度

length 成员函数返回字符串的长度。size 成员函数可以实现同样的功能。

4. string对象中字符串的连接

除了可以使用+和+=运算符对 string 对象执行字符串的连接操作外,string 类还有 append 成员函数,可以用来向字符串后面添加内容。append 成员函数返回对象自身的引用。例如:

string s1("123"), s2("abc");
s1.append(s2);  // s1 = "123abc"
s1.append(s2, 1, 2);  // s1 = "123abcbc"
s1.append(3, 'K');  // s1 = "123abcbcKKK"
s1.append("ABCDE", 2, 3);  // s1 = "123abcbcKKKCDE",添加 "ABCDE" 的子串(2, 3)

5. string对象的比较

除了可以用 <、<=、==、!=、>=、> 运算符比较 string 对象外,string 类还有 compare 成员函数,可用于比较字符串。compare 成员函数有以下返回值:
小于 0 表示当前的字符串小;
等于 0 表示两个字符串相等;
大于 0 表示另一个字符串小。

例如:

string s1("hello"), s2("hello, world");
int n = s1.compare(s2);
n = s1.compare(1, 2, s2, 0, 3);  //比较s1的子串 (1,2) 和s2的子串 (0,3)
n = s1.compare(0, 2, s2);  // 比较s1的子串 (0,2) 和 s2
n = s1.compare("Hello");
n = s1.compare(1, 2, "Hello");  //比较 s1 的子串(1,2)和"Hello”
n = s1.compare(1, 2, "Hello", 1, 2);  //比较 s1 的子串(1,2)和 "Hello" 的子串(1,2)

6. 求 string 对象的子串

substr 成员函数可以用于求子串 (n, m),原型如下:

string substr(int n = 0, int m = string::npos) const;

调用时,如果省略 m 或 m 超过了字符串的长度,则求出来的子串就是从下标 n 开始一直到字符串结束的部分。例如:

string s1 = "this is ok";
string s2 = s1.substr(2, 4);  // s2 = "is i"
s2 = s1.substr(2);  // s2 = "is is ok"

7. 交换两个string对象的内容

swap 成员函数可以交换两个 string 对象的内容。例如:

string s1("West”), s2("East");
s1.swap(s2);  // s1 = "East",s2 = "West"

8. 查找子串和字符

string 类有一些查找子串和字符的成员函数,它们的返回值都是子串或字符在 string 对象字符串中的位置(即下标)。如果查不到,则返回 string::npos。string: :npos 是在 string 类中定义的一个静态常量。这些函数如下:

find:从前往后查找子串或字符出现的位置。
rfind:从后往前查找子串或字符出现的位置。
find_first_of:从前往后查找何处出现另一个字符串中包含的字符。例如:
s1.find_first_of("abc");  //查找s1中第一次出现"abc"中任一字符的位置
find_last_of:从后往前查找何处出现另一个字符串中包含的字符。
find_first_not_of:从前往后查找何处出现另一个字符串中没有包含的字符。
find_last_not_of:从后往前查找何处出现另一个字符串中没有包含的字符。

下面是 string 类的查找成员函数的示例程序。

#include <iostream>
#include <string>
using namespace std;
int main()
{string s1("Source Code");int n;if ((n = s1.find('u')) != string::npos) //查找 u 出现的位置cout << "1) " << n << "," << s1.substr(n) << endl;//输出 l)2,urce Codeif ((n = s1.find("Source", 3)) == string::npos)//从下标3开始查找"Source",找不到cout << "2) " << "Not Found" << endl;  //输出 2) Not Foundif ((n = s1.find("Co")) != string::npos)//查找子串"Co"。能找到,返回"Co"的位置cout << "3) " << n << ", " << s1.substr(n) << endl;//输出 3) 7, Codeif ((n = s1.find_first_of("ceo")) != string::npos)//查找第一次出现或 'c'、'e'或'o'的位置cout << "4) " << n << ", " << s1.substr(n) << endl;//输出 4) l, ource Codeif ((n = s1.find_last_of('e')) != string::npos)//查找最后一个 'e' 的位置cout << "5) " << n << ", " << s1.substr(n) << endl;  //输出 5) 10, eif ((n = s1.find_first_not_of("eou", 1)) != string::npos)//从下标1开始查找第一次出现非 'e'、'o' 或 'u' 字符的位置cout << "6) " << n << ", " << s1.substr(n) << endl;//输出 6) 3, rce Codereturn 0;
}

9. 替换子串

replace 成员函数可以对 string 对象中的子串进行替换,返回值为对象自身的引用。例如:

string s1("Real Steel");
s1.replace(1, 3, "123456", 2, 4);  //用 "123456" 的子串(2,4) 替换 s1 的子串(1,3)
cout << s1 << endl;  //输出 R3456 Steel
string s2("Harry Potter");
s2.replace(2, 3, 5, '0');  //用 5 个 '0' 替换子串(2,3)
cout << s2 << endl;  //输出 HaOOOOO Potter
int n = s2.find("OOOOO");  //查找子串 "00000" 的位置,n=2
s2.replace(n, 5, "XXX");  //将子串(n,5)替换为"XXX"
cout << s2 < < endl;  //输出 HaXXX Potter

10. 删除子串

erase 成员函数可以删除 string 对象中的子串,返回值为对象自身的引用。例如:

string s1("Real Steel");
s1.erase(1, 3);  //删除子串(1, 3),此后 s1 = "R Steel"
s1.erase(5);  //删除下标5及其后面的所有字符,此后 s1 = "R Ste"

11. 插入字符串

insert 成员函数可以在 string 对象中插入另一个字符串,返回值为对象自身的引用。例如:

string s1("Limitless"), s2("00");
s1.insert(2, "123");  //在下标 2 处插入字符串"123",s1 = "Li123mitless"
s1.insert(3, s2);  //在下标 3 处插入 s2 , s1 = "Li10023mitless"
s1.insert(3, 5, 'X');  //在下标 3 处插入 5 个 'X',s1 = "Li1XXXXX0023mitless"

12. 将 string 对象作为流处理

使用流对象 istringstream 和 ostringstream,可以将 string 对象当作一个流进行输入输出。使用这两个类需要包含头文件 sstream。

示例程序如下:

#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main()
{string src("Avatar 123 5.2 Titanic K");istringstream istrStream(src); //建立src到istrStream的联系string s1, s2;int n;  double d;  char c;istrStream >> s1 >> n >> d >> s2 >> c; //把src的内容当做输入流进行读取ostringstream ostrStream;ostrStream << s1 << endl << s2 << endl << n << endl << d << endl << c <<endl;cout << ostrStream.str();return 0; }

程序的输出结果是:

Avatar
Titanic
123
5.2
K

第 11 行,从输入流 istrStream 进行读取,过程和从 cin 读取一样,只不过输入的来源由键盘变成了 string 对象
src。因此,“Avatar” 被读取到 s1,123 被读取到 n,5.2 被读取到 d,“Titanic” 被读取到s2,‘K’ 被读取到 c.

第 12 行,将变量的值输出到流 ostrStream。输出结果不会出现在屏幕上,而是被保存在 ostrStream 对象管理的某处。用 ostringstream 类的 str 成员函数能将输出到 ostringstream 对象中的内容提取出来。

13. 用 STL 算法操作 string 对象

string 对象也可以看作一个顺序容器,它支持随机访问迭代器,也有 begin 和 end 等成员函数。STL 中的许多算法也适用于 string 对象。下面是用 STL 算法操作 string 对象的程序示例。

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main()
{string s("afgcbed");string::iterator p = find(s.begin(), s.end(), 'c');if (p!= s.end())cout << p - s.begin() << endl;  //输出 3sort(s.begin(), s.end());cout << s << endl;  //输出 abcdefgnext_permutation(s.begin(), s.end());cout << s << endl; //输出 abcdegfreturn 0;
}

c++ string类 知识点整理相关推荐

  1. C++---string类接口整理与深浅拷贝

    string:是表示字符串序列的类,不能操作多字节或者变长字符序列 在使用string类时,必须包含#include头文件以及using namespace std; 常见的接口整理 常见的strin ...

  2. C++string类知识点总结

    一.string的初始化 首先,为了在程序中使用string类型,必须包含头文件 <string>.如下: #include <string> 注意这里不是string.h,s ...

  3. c++ 输出string_来讲讲Java中String 类的知识点

    本文来总结一下Stirng 的有关知识点 1.String中的引用 String 可以通过new和构造方法来创建一个对象,用s来引用它(也就是相当于把asdf这个字符串赋值给s String s = ...

  4. (转载)类欧几里得(知识点整理+板子总结)

    思路来源 类欧几里得算法_wwx233的博客-CSDN博客 类欧几里得算法 - cyz666 - 博客园 类欧几里得算法总结_DZYO的博客-CSDN博客(证明清楚详细) 数数[数位DP||类欧]_以 ...

  5. C++知识点42——下标运算符[]的重载及string类的实现

    一.下标运算符的重载 1.概念 如果一个类表示容器,那么要重载下标运算符[],下标运算符必须是成员函数.下表访问运算符通常要有一个const版本和一个非const版本.如果不定义const版本,那么c ...

  6. Java的知识点21——String类、StringBuffer和StringBuilder、不可变和可变字符序列使用陷阱

    String类 String 类对象代表不可变的Unicode字符序列,因此我们可以将String对象称为"不可变对象" substring()是对字符串的截取操作,但本质是读取原 ...

  7. java的知识点15——String基础、String类和常量池、String类常用的方法、字符串相等的判断、组合模式

    String基础 1. String类又称作不可变字符序列. 2. String位于java.lang包中,Java程序默认导入java.lang包下的所有类. 3. Java字符串就是Unicode ...

  8. Java 知识点整理-7.StringBuffer类+冒泡排序+选择排序+二分法+Arrays类+基本数据类型的包装类

    1.StringBuffer类概述:线程安全的可变字符序列,一个类似于String的字符串缓冲区,但不能修改(不能像String那样用加号与其他类型数据连接),但通过某些方法调用可以改变该序列的长度和 ...

  9. 大数据 -- kafka学习笔记:知识点整理(部分转载)

    一 为什么需要消息系统 1.解耦 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险.许多 ...

最新文章

  1. 腾讯宣布员工最高可申请免息借款90万!网友:应届当码农就能一线城市买房了!...
  2. 「MICCAI 2017」Reading Notes
  3. Android利用Jsoup解析html 开发网站客户端小记。
  4. matlab实时数据传输,利用QuaRC实现c++与simulink(matlab)之间实时双向数据传输
  5. Spark _08窄依赖和宽依赖stage
  6. HUE Load Balancer 启动失败
  7. java面向对象数组_Java面向对象的构造器与数组对象
  8. LG_3459_[POI2007]MEG-Megalopolis
  9. mysql 5.1主从_MySQL5.1版本的主从复制搭建 | 学步园
  10. unity把两个相机渲染的场景显示在同个窗口
  11. 空间里相片批量导入u盘_怎样将U盘内相片弄到QQ空间的相册内
  12. css html5布局方式_创建新HTML5 / CSS3单页布局–艺术主题
  13. WordPress博客自媒体主题:Autumn
  14. dismiss和remove_Android对话框之dismiss和cancel和hide区别
  15. 小红书引流推广的终极秘籍之笔记排名
  16. kettle 用cmd bat来运行ktr和kjb
  17. 精准DNA甲基化/羟甲基化测序(oxBS-seq)|易基因技术推介
  18. 2021年全球望远镜收入大约1161.6百万美元,预计2028年达到1275百万美元
  19. unshift() 与shift() 方法
  20. Android Zxing3.3.2扫描、生成、解析二维码,以及近距离无法识别的问题

热门文章

  1. docker 在window 10 专业版的安装 .net core 在docker的部署
  2. 【转载】Eclipse vs IDEA快捷键对比大全(win系统)
  3. ffmpeg的mac安装
  4. Android 关于后台杀死App之后改变服务器状态的一些尝试
  5. 关于 vmware虚拟机的一些问题及解决办法备忘
  6. 多线程中线程参数的传递,不要使用局部变量
  7. POJ 2185 Milking Grid (KMP,GCD)
  8. 搜索引擎、相关性算法的测试
  9. SuperMap IS.NET自定义Action添加Mark
  10. Flutter PageView 属性使用详解