C++ string的深入理解

Posted 自首的小偷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ string的深入理解相关的知识,希望对你有一定的参考价值。

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_string<char, char_traits, allocator>string;
    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+尽量少用,因为传值返回,导致深拷贝效率低
拼接字符串

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

以上是关于C++ string的深入理解的主要内容,如果未能解决你的问题,请参考以下文章

以下代码片段 C++ 的说明

深入理解C++中的异常处理机制

深入理解C++迭代器:让你的C++代码更加灵活

深入理解DOM节点类型第四篇——文档片段节点DocumentFragment

更新:C++ 指针片段

深入理解Java中的String