1、简介

要使用 string 类,必须包含头文件 <string>。string 库提供了许多其他功能,如删除字符串的部分或全部,用一个字符的部分或全部替换另一个字符串的部分或全部,插入、删除字符串中数据,比较、提取、复制、交换等。

2、string类成员函数汇总

表 1 string 类的所有成员函数
函数名称 功能
构造函数 产生或复制字符串
析构函数 销毁字符串
=,assign 赋以新值
Swap 交换两个字符串的内容
+ =,append( ),push_back() 添加字符
insert () 插入字符
erase() 删除字符
clear () 移除全部字符
resize () 改变字符数量
replace() 替换字符
+ 串联字符串
==,! =,<,<=,>,>=,compare() 比较字符串内容
size(),length() 返回字符数量
max_size () 返回字符的最大可能个数
empty () 判断字符串是否为空
capacity () 返回重新分配之前的字符容量
reserve() 保留内存以存储一定数量的字符
[],at() 存取单一字符
>>,getline() 从 stream 中读取某值
<< 将值写入 stream
copy() 将内容复制为一个 C - string
c_str() 将内容以 C - string 形式返回
data() 将内容以字符数组形式返回
substr() 返回子字符串
find() 搜寻某子字符串或字符
begin( ),end() 提供正向迭代器支持
rbegin(),rend() 提供逆向迭代器支持
get_allocator() 返回配置器


3、String类的构造函数以及析构函数

常见的 string 类构造函数有以下几种形式:

    string strs ;//生成空字符串
string s(str);//生成字符串str的复制品
string s(str, stridx) ; //将字符串str中始于stridx的部分作为构造函数的初值
string s(str, strbegin, strlen); //将字符串str中始于strbegin、长度为strlen的部分作为字符串初值
string s(cstr);//以C_string类型cstr作为字符串s的初值
string s(cstr,char_len);//以C_string类型cstr的前char_len个字符串作为字符串s的初值
string s(num, c);//生成一个字符串,包含num个c字符
string s(strs, beg, end) ;//以区间[beg, end]内的字符作为字符串s的初值

析构函数如下:

    ~string() ;    //销毁所有内存,释放内存

例1 string的构造

#include <iostream>
#include <string>
using namespace std; int main ()
{
string str ("12345678");
char ch[ ] = "abcdefgh";
string a; //定义一个空字符串
string str1 (str); //构造函数,全部复制
string str2 (str, 2, 5); //构造函数,从字符串str的第2个元素开始,复制5个元素,赋值给str_2
string str3 (ch, 5); //将字符串ch的前5个元素赋值给str_3
string str4 (5,'X'); //将 5 个 'X' 组成的字符串 "XXXXX" 赋值给 str_4
string str5 (str.begin(), str.end()); //复制字符串 str 的所有元素,并赋值给 str_5
cout << str << endl;
cout << a << endl ;
cout << str1 << endl;
cout << str2 << endl;
cout << str3 << endl;
cout << str4 << endl;
cout << str5 << endl;
return 0;
}

程序运行结果:

12345678

12345678
34567
abcde
XXXXX
12345678

## 4、获取字符串长度
String 类型对象包括三种求解字符串长度的函数:``size()`` 和`` length()``、 ``maxsize() ``和`` capacity()``:
- ``size() 和 length()``这两个函数会返回 string 类型对象中的字符个数,且它们的执行效果相同。
- ``max_size() ``函数返回 string 类型对象最多包含的字符数。一旦程序使用长度超过 max_size() 的 string 操作,编译器会拋出 length_error 异常。
- ``capacity()`` 该函数返回在重新分配内存之前,string 类型对象所能包含的最大字符数。

例2 string获取长度

#include <iostream>
#include <string>
using namespace std;
int main ()
{
int size = 0;
int length = 0;
unsigned long maxsize = 0;
int capacity=0;
string str ("12345678");
string str_custom;
str_custom = str;
str_custom.resize (5);
size = str_custom.size();
length = str_custom.length();
maxsize = str_custom.max_size();
capacity = str_custom.capacity();
cout << "size = " << size << endl;
cout << "length = " << length << endl;
cout << "maxsize = " << maxsize << endl;
cout << "capacity = " << capacity << endl;
return 0;
}

程序运行结果:

size = 8
length = 8
maxsize = 2147483647
capacity = 15

## 5、获取字符串元素
    字符串中元素的访问是允许的,一般可使用两种方法访问字符串中的单一字符:``下标操作符[] ``和 ``成员函数at()``。两者均返回指定的下标位置的字符。第 1 个字符索引(下标)为 0,最后的字符索引为 length()-1。

需要注意的是,这两种访问方法是有区别的:

  • 下标操作符 [] 在使用时不检查索引的有效性,如果下标超出字符的长度范围,会示导致未定义行为。对于常量字符串,使用下标操作符时,字符串的最后字符(即 '\0')是有效的。对应 string 类型对象(常量型)最后一个字符的下标是有效的,调用返回字符 '\0'。
  • 函数 at() 在使用时会检查下标是否有效。如果给定的下标超出字符的长度范围,系统会抛出 out_of_range 异常。

例3 string获取字符串元素

#include <iostream>
#include <string>
using namespace std;
int main()
{
string s ("abcde");
char temp =0;
char temp_1 = 0;
temp = s [2]; //"获取字符 'c'
temp_1 = s.at(2); //获取字符 'c'
cout << temp << " " << temp_1 << std::endl;
return 0;
}

程序运行结果:

c c

## 6、字符串比较方法
    string 类模板既提供了`` >、=、1、compare()函数

函数原型:

    int compare (const basic_string& s) const;
int compare (const Ch* p) const;
int compare (size_type pos, size_type n, const basic_string& s) const;
int compare (size_type pos, size_type n, const basic_string& s,size_type pos2, size_type n2) const;
int compare (size_type pos, size_type n, const Ch* p, size_type = npos) const;

例4 string比较之compare

#include <iostream>
#include <string>
using namespace std;
int main ()
{
string A ("aBcdef");
string B ("AbcdEf");
string C ("123456");
string D ("123dfg");
//下面是各种比较方法
int m=A.compare (B); //完整的A和B的比较
int n=A.compare(1,5,B,4,2); //"Bcdef"和"AbcdEf"比较
int p=A.compare(1,5,B,4,2); //"Bcdef"和"Ef"比较
int q=C.compare(0,3,D,0,3); //"123"和"123"比较
cout << "m = " << m << ", n = " << n <<", p = " << p << ", q = " << q << endl;
cin.get();
return 0;
}

程序运行结果:

m = 1, n = -1, p = -1, q = 0

由此可知,string 类的比较 compare() 函数使用非常方便,而且能区分字母的大小写。

2、比较运算符

String 类的常见运算符包括 >、<、==、>=、<=、!=。

例5 String比较之比较运算符

#include <iostream>
#include <string>
using namespace std;
void TrueOrFalse (int x)
{
cout << (x?"True":"False")<<endl;
} int main ()
{
string S1 = "DEF";
string CP1 = "ABC";
string CP2 = "DEF";
string CP3 = "DEFG";
string CP4 ="def";
cout << "S1= " << S1 << endl;
cout << "CP1 = " << CP1 <<endl;
cout << "CP2 = " << CP2 <<endl;
cout << "CP3 = " << CP3 <<endl;
cout << "CP4 = " << CP4 <<endl;
cout << "S1 <= CP1 returned ";
TrueOrFalse (S1 <=CP1);
cout << "S1 <= CP2 returned ";
TrueOrFalse (S1 <= CP2);
cout << "S1 <= CP3 returned ";
TrueOrFalse (S1 <= CP3);
cout << "CP1 <= S1 returned ";
TrueOrFalse (CP1 <= S1);
cout << "CP2 <= S1 returned ";
TrueOrFalse (CP2 <= S1);
cout << "CP4 <= S1 returned ";
TrueOrFalse (CP4 <= S1);
cin.get();
return 0;
}

程序运行结果:

S1= DEF
CP1 = ABC
CP2 = DEF
CP3 = DEFG
CP4 = def
S1 <= CP1 returned False
S1 <= CP2 returned True
S1 <= CP3 returned True
CP1 <= S1 returned True
CP2 <= S1 returned True
CP4 <= S1 returned False

在使用时比较运算符时,对于参加比较的两个字符串,任一个字符串均不能为 NULL,否则程序会异常退出。

## 7、字符串输入输出
    字符串的输入输出直接用``cin``和``cout``就可以,但是``cin``在遇到空格后就会停止输入,无法读入带有空格的字符串,读入带空格的字符串可以用``getline( cin ,str )``.
例6 String输入输出
```
#include
#include
using namespace std;
void main ()
{
string s1, s2;
getline(cin, s1);
getline(cin, s2, ' ');
cout 123456
asdfgh klj
You inputed chars are: 123456
You inputed chars are: asdfgh

8、字符串查找函数

在 STL 中,字符串的查找功能可以实现多种功能,比如说:

  • 搜索单个字符、搜索子串;
  • 实现前向搜索、后向搜索;
  • 分别实现搜索第一个和最后一个满足条件的字符(或子串);

    若查找 find() 函数和其他函数没有搜索到期望的字符(或子串),则返回 npos;若搜索成功,则返回搜索到的第 1 个字符或子串的位置。其中,npos 是一个无符号整数值,初始值为 -1。当搜索失败时, npos 表示“没有找到(not found)”或“所有剩佘字符”。

    值得注意的是,所有查找 find() 函数的返回值均是 size_type 类型,即无符号整数类型。该返回值用于表明字符串中元素的个数或者字符在字符串中的位置。

    字符串有另一种查找为rfind()实现逆向查找。

find() 函数的原型主要有以下 4 种:

size_type find (value_type _Chr, size_type _Off = 0) const;
//find()函数的第1个参数是被搜索的字符、第2个参数是在源串中开始搜索的下标位置
size_type find (const value_type* _Ptr , size_type _Off = 0) const;
//find()函数的第1个参数是被搜索的字符串,第2个参数是在源串中开始搜索的下标位置
size_type find (const value_type* _Ptr, size_type _Off = 0, size_type _Count) const;
//第1个参数是被搜索的字符串,第2个参数是源串中开始搜索的下标,第3个参数是关于第1个参数的字符个数,可能是 _Ptr 的所有字符数,也可能是 _Ptr 的子串宇符个数
size_type find (const basic_string& _Str, size_type _Off = 0) const;
//第1个参数是被搜索的字符串,第2参数是在源串中开始搜索的下标位置

例7 string比较之查找

#include <iostream>
#include <string>
using namespace std; int main(){
string x ("Hi, Peter, I'm sick. Please bought some drugs for me."); int p = x.find('P');
int rp = x.rfind('P');
cout << "find()查找的P在第 " << p << " 位"<< endl;
cout << "rfind()查找的P在第 " << rp << " 位"<< endl; int q = x.find("some",0);
int rq = x.rfind("some",0);
cout << "find()查找的some在第 " << q << " 位"<< endl;
cout << "rfind()查找的some在第 " << rq << " 位"<< endl; int l = x.find (" drugs", 0, 5);
int rl = x.rfind (" drugs", 0, 5);
cout << "find()查找的' drugs'在第 " << l << " 位"<< endl;
cout << "rfind()查找的' drugs'在第 " << rl << " 位"<< endl; string y ("sick");
int m = x.find (y, 0);
int rm = x.rfind (y, 0);
cout << "find()查找的y字符串在第 " << m << " 位"<< endl;
cout << "rfind()查找的y字符串在第 " << rm << " 位"<< endl; return 0;
}

程序运行结果:

find()查找的P在第 4 位
rfind()查找的P在第 21 位
find()查找的some在第 35 位
rfind()查找的some在第 -1 位
find()查找的' drugs'在第 39 位
rfind()查找的' drugs'在第 -1 位
find()查找的y字符串在第 15 位
rfind()查找的y字符串在第 -1 位

string 类支持迭代器

string::iterator iterA = A.begin ();

C++ STL介绍——String类的更多相关文章

  1. STL 的string类怎么啦?

    前言   上个周末在和我的同学爬香山闲聊时,同学说到STL中的string类曾经让他备受折磨,几年前他开发一个系统前对string类还比较清楚,然后随着程序的复杂度的加深,到了后期,他几乎对strin ...

  2. STL:string类中size()与length()的区别

    结论是:两者没有任何区别 解释: C++Reference中对于两者的解释: 两者的具体解释都一模一样: 理解: length是因为C语言的习惯而保留下来的,string类最初只有length,引进S ...

  3. STL之string类详解

    通过在网站上的资料搜集,得到了很多关于string类用法的文档,通过对这些资料的整理和加入一些自己的代码,就得出了一份比较完整的关于string类函数有哪些和怎样用的文档了!下面先罗列出string类 ...

  4. C++ STL介绍——简介

    目录 1.什么是STL 2.STL中六大组件 2.1 容器(Container) 2.2 迭代器(Iterator) 2.3 算法(Algorithm) 2.4 仿函数(Functor) 2.5 适配 ...

  5. JDK1.8源码(三)——java.lang.String 类

    String 类也是java.lang 包下的一个类,算是日常编码中最常用的一个类了,那么本篇博客就来详细的介绍 String 类. 1.String 类的定义 public final class ...

  6. 一大波Java来袭(四)String类、StringBuilder类、StringBuffer类对照

    本文主要介绍String类.StringBuffer类.StringBuilder类的差别  : 一.概述 (一)String 字符串常量.可是它具有不可变性,就是一旦创建,对它进行的不论什么改动操作 ...

  7. C++标准模板库Stand Template Library(STL)简介与STL string类

    参考<21天学通C++>第15和16章节,在对宏和模板学习之后,开启对C++实现的标准模板类STL进行简介,同时介绍简单的string类.虽然前面对于vector.deque.list等进 ...

  8. 全面深入介绍C++字符串:string类

    http://blog.csdn.net/liuliming3000/article/details/1809385 1 从C到C++ string类 2 string类的构造函数 3 string类 ...

  9. STL库中string类内存布局的探究

    在STL中有着一个类就是string类,他的内存布局和存储机制究竟是怎么样的呢? 这就是建立好的string 可以看出,图中用黄色框框标注的部分就是主要区域 我们用来给string对象进行初始化的字符 ...

随机推荐

  1. springboot学习入门简易版一---springboot2.0介绍

    1.1为什么用springboot(2) 传统项目,整合ssm或ssh,配置文件,jar冲突,整合麻烦.Tomcat容器加载web.xml配置内容 springboot完全采用注解化(使用注解方式启动 ...

  2. py-1 语言介绍

    一.编程与编程语言 1.编程的目的 计算机的发明,是为了用机器取代并解放人力.而编程的目的则是将人类的思想流程按照某种能够被计算机识别的表达方式传递给计算机,从而达到让计算机能够像人脑.电脑一样自动执 ...

  3. Python memory error的问题

    前段时间在读取一个文件的过程中,竟然出现了Memory Error!简直让我怀疑自己买了个假电脑,毕竟是8G内存i7处理器,一度怀疑自己装了假的内存条....下面说一下几个解题步骤....一般就是用下 ...

  4. Android NDK 同时编译多个模块

    |-test |---Android.mk |---Application.mk |---sub1 |------Android.mk |------main.c |---sub2 |------An ...

  5. Nginx access_log日志添加返回字段

    主要为方便单用户请求日志回溯分析   记录用户标记. 将用户信息打印在access_log 日志里. 步骤: 1.重写nginx 的log格式 一般是地址是  /etc/nginx/conf.d/ng ...

  6. linux systemd 从简单的例子入门

    linux systemd 从简单的例子入门 网上很多相关链接,一上来就给一大堆命令和讲解,让人头都大. 我们希望有一个service(服务),让它在开机启动的时候就执行. 用 root 登陆以后: ...

  7. 57、springmvc-整合

    57.springmvc-整合 57.1 创建Spring MVC Annotation项目 <?xml version="1.0" encoding="UTF-8 ...

  8. [NgRx] NgRx Runtime Checks

    Turn on runtime check: @NgModule({ declarations: [AppComponent], imports: [ ..., StoreModule.forRoot ...

  9. element案例大杂烩

    修改表头字体粗细? <el-table :data="list" header-row-class-name="tableHead"> 自定义即可 ...

  10. day 50 jquary 终极版本

    jQuary 一.jquary对象和dom对象 jquary找到的标签对象成为-- jquary对象 原生js找到的标签对象成为 -- dom对象 dom对象只能使用dom对象的方法,不能使用jque ...