C++ string的深入理解
Posted 自首的小偷
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ string的深入理解相关的知识,希望对你有一定的参考价值。
String类介绍
string的文档介绍
- 字符串是表示字符序列的类
- 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作
单字节字符字符串的设计特性。 - string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信
息,请参阅basic_string)。 - string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits
和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。 - 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个
类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。
总结:- string是表示字符串的字符串类
- 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
比特科技 - string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>string;
- 不能操作多字节或者变长字符的序列。在使用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填充
- size()和length():返回string对象的字符个数,他们执行效果相同。
- 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+尽量少用,因为传值返回,导致深拷贝效率低
拼接字符串
把两个字符串拼接成一个字符串。
以上是关于C++ string的深入理解的主要内容,如果未能解决你的问题,请参考以下文章