资讯专栏INFORMATION COLUMN

C++ string的深入理解

darkbaby123 / 1898人阅读

摘要:迭代器返回一个迭代器,该迭代器指向字符串结束字符的过去部分。不得取消对其的引用。如果字符串对象是限定的,则函数返回一个迭代器。此值在字符串的成员函数中用作或参数的值时,表示直到字符串结束。

String类介绍
string的文档介绍

  1. 字符串是表示字符序列的类
  2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作
    单字节字符字符串的设计特性。
  3. string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信
    息,请参阅basic_string)。
  4. string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits
    和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。
  5. 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个
    类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。
    总结:
    1. string是表示字符串的字符串类
    2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
      比特科技
    3. string在底层实际是:basic_string模板类的别名,typedef basic_stringstring;
    4. 不能操作多字节或者变长字符的序列。在使用string类时,必须包含#include头文件以及using namespace std;

一、String的构造方法
string构造方法文档介绍

这是文档对string对的构造方法地描述,以下是对string构造函数地具体说明。

string() 构造空的string类对象,即空字符串
string(const char* s) 用C-string来构造string类对象
string(size_t n, char c) string类对象中包含n个字符c
string(const string&s) 拷贝构造函数

void text() {	string str;	string s("123456789");	string ss(8, "a");	string st(s);	cout << str << endl;	cout << s << endl;	cout << ss << endl;	cout << st << endl;}


箭头标出来的是空字符串,s通过拷贝构造把值传给了str,只不过值空字符串。

二、string容量操作介绍

size 返回字符串有效字符长度
length 返回字符串有效字符长度
capacity 返回空间总大小
empty 检测字符串释放为空串,是返回true,否则返回false
clear 清空有效字符
reserve 为字符串预留空间**
resize 将有效字符的个数该成n个,多出的空间用字符c填充

  1. size()和length():返回string对象的字符个数,他们执行效果相同。
  2. capacity():重新分配内存之前,string对象能包含的最大字符数

capacity表示为字符串预留空间的大小这是表示s1的预留空间大小为15而有效字符串长度为9.

empty检测字符串释放为空串当s1不是空串是输出的是0,当执行了clear()情况了字符串时empty检测s1为空串输出为1。

resize 将s1有效字符的个数该成10个输出了size大小为10,size大小表示有效字符串的数。

size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。
clear()只是将string中有效字符清空,不改变底层空间大小。
resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字 符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t
n, char c)用字符c来填充多出的 元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。
reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小

三、string类对象的访问及遍历操作

operator[] 返回pos位置的字符,const string类对象调用
begin+ end
begin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
rbegin + rend
begin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
范围for C++11支持更简洁的范围for的新遍历方式

文档介绍:

1.operator[]方式
字符串中指定位置的字符。如果字符串对象是const限定的,则函数返回一个const char&。否则,它将返回一个字符&

通过for循环方式打印出数据这和数组遍历打印数据差不了多少。
2.迭代器
返回一个迭代器,该迭代器指向字符串结束字符的过去部分。
结束字符后面的过去字符是字符串中最后一个字符后面的理论字符。不得取消对其的引用。
由于标准库函数使用的范围不包括其结束迭代器所指向的元素,因此此函数通常与string::begin结合使用,以指定包含字符串中所有字符的范围。
如果对象是空字符串,则此函数返回与string::begin相同的值。
一个迭代器,指向字符串的末尾。
如果字符串对象是const限定的,则函数返回一个const_迭代器。否则,它将返回一个迭代器。
成员类型迭代器和常量迭代器是随机访问迭代器类型(分别指向字符和常量字符)。

void text() {	string s1("123456789");	string sss("123456");	for (int i = 0; i < s1.size(); i++) {		cout << s1[i] << " " ;	}	string::iterator it = s1.begin();	while (it != s1.end()) {		cout << *it << " ";		it++;	}}


3.反向迭代器
就是利用迭代器逆向输出string中的数据

string::reverse_iterator it = s1.rbegin();	while (it != s1.rend()) {		cout << *it << " ";		it++;	}

这不是难实现,利用for循环也可以逆向打印数据。
4.范围for
C++新标准提供的范围for语句.这种语句遍历给定序列中个元素并对序列中每一个值执行某种操作,其语法形式是:

for(declaration : expression)
statement

其中,expression 部分是一个对象,用于表示一个序列。declaration 部分负责定义一个变量,该变量将用于访问序列中的基础元素。每次迭代,declaration部分的变量会被初始化为expression部分的下一个元素值。

此例中通过使用auto关键字让编译器来决定变量o的类型,这里o的类型是char.每次迭代,s1的下一个字符被拷贝给o,因此该循环可以读作“对于字符串str中的每个字符o,”执行某某操作。此例中的某某操作 即输出一个字符,然后换行。

四、string的修改

push_back 在字符串后尾插字符c
append 在字符串后追加一个字符串
operator+= (重点) 在字符串后追加字符串str
c_str(重点) 返回C格式字符串
find + npos(重点) 从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
rfind 从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置 substr
在str中从pos位置开始,截取n个字符,然后将其返回


push_back只能插入一个字符,而且不能插入字符串,而append不竟能插入字符,而且能插入字符串。
operator+= 在字符串后追加字符串str,这也是字符串修改中最常用的方法。
find:
find的文档介绍

第一个匹配的第一个字符的位置。
如果未找到匹配项,则函数返回字符串::npos。
size_ t是无符号整数类型(与成员类型string::size_t类型相同)。

找到就返回它的位置,找不到返回-1,也有的地方说是npos这里npos意思是一至的。
文档中是这样介绍:

npos是一个静态成员常量值,对于类型为size_t的元素,其值可能最大。
此值在字符串的成员函数中用作len(或sublen)参数的值时,表示“直到字符串结束”。
作为返回值,它通常用于指示不匹配。
此常量的定义值为-1,因为size_t是无符号整数类型,所以它是此类型的最大可能表示值。

substr:

这个例子是把s从第3个字符开始截取到npos也就是字符串末尾。
五、其他方法
operator+尽量少用,因为传值返回,导致深拷贝效率低
拼接字符串

把两个字符串拼接成一个字符串。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/123600.html

相关文章

  • JavaScript 程序员可以从C++中学到什么

    摘要:特别是所谓的不需要的引用可能会导致内存泄漏,这意味着程序占用的内存比实际需要的多,从而降低了内存的效率。但是如果我们能够意识到内存泄漏的风险,就可以采取措施将其删除。意外的使用全局变量是导致内存泄漏的一个常见原因。 作者:Bret Cameron翻译:疯狂的技术宅原文:https://medium.com/@bretcamer... 本文首发微信公众号:前端先锋欢迎关注,每天都给你...

    不知名网友 评论0 收藏0
  • 【修炼内功】[JVM] 深入理解JVM之ClassLoader

    摘要:本文已收录修炼内功跃迁之路在诞生之初便提出,各提供商发布很多不同平台的虚拟机,这些虚拟机都可以载入并执行同平台无关的字节码。设计者在第一版虚拟机规范中便承诺,时至今日,商业机构和开源机构已在之外发展出一大批可以在上运行的语言,如等。 本文已收录【修炼内功】跃迁之路 Java在诞生之初便提出 Write Once, Run Anywhere,各提供商发布很多不同平台的虚拟机,这些虚拟机...

    荆兆峰 评论0 收藏0
  • 从表到里学习JVM实现

    在社会化分工、软件行业细分专业化的趋势下,会真的参与到底层系统实现的人肯定是越来越少(比例上说)。真的会参与到JVM实现的人肯定是少数。 但如果您对JVM是如何实现的有兴趣、充满好奇,却苦于没有足够系统的知识去深入,那么可以参考RednaxelaFX整理的这个书单。 showImg(http://segmentfault.com/img/bVbGzn); 本豆列的脉络是:    1. JV...

    Cristic 评论0 收藏0
  • 系统地学习C++

    摘要:本书主要围绕一系列逐渐复杂的程序问题,以及用以解决这些问题的语言特性展开讲解。你不只学到的函数和结构,也会学习到它们的设计目的和基本原理。因此我们把精力集中在最有价值的地方。本书不仅是对模板的权威解释,而且本书还深入地介绍了其他一般的思想。 C++ 入门教程(41课时) - 阿里云大学 C+...

    joyqi 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<