string

string

1、初识string

我们搜索string,就会发现,string其实是basic_string模板,指定类型参数为char,而实例化出来的类,再将这个类重命名为string。

而为什么要用basic_string模板来实例化出string呢?

答案是为了实例化出不同的(模板)类,用来存储不同类型的字符数据:




而我们需要不同字符类型的原因,与"编码"有关,这里我们不做深入探讨。现阶段只需好好掌握string的用法。

2、string的基本用法

2.1、构造

构造空内容:

cpp 复制代码
string s1();

拷贝构造:

cpp 复制代码
string s2(s1);

拷贝部分字符串:


拷贝部分字符串,用法上,参数列表中第一个位置为被拷贝的对象(也可以是一个常量字符串),第二个位置是拷贝的起始位置,第三个位置是要拷贝的字符个数。

当第三个位置给的值大于剩余字符个数,那么系统就会将剩余所有字符都拷贝过去。

注意到第三个位置会给一个默认值npos。npos是string类的一个静态成员变量:

npos是无符号整型的-1,这已经代表了要拷贝字符个数的最大值,保证了指定位置之后的所有内容都能被拷贝到。

传入常量字符串构造:

cpp 复制代码
string s4("Hello world!");

传入常量字符串的前n个字符构造:

传入n个字符构造:

2.2、析构

析构函数不用过多了解,因为我们使用的是编译器默认生成的构造函数和析构函数。

2.3、operator=

重载=:

  • 传入对象赋值
  • 传入常量字符串赋值
  • 传入字符赋值

2.4、遍历和修改

string对象的遍历和修改方法,可以直接用数组形式的方法:


这得益于运算符重载:operator[]。

operator[]的底层实现可能是这样的:

这样实现,有两个好处:

1、传引用返回,可以修改返回值。对比指针可不行(传值返回事先拷贝了一份,拷贝值有常性不可修改;传引用返回为对象本身,可以修改)。


2、实现为函数,可以在函数体内进行越界断言检查。对比C语言的数组越界抽查,更安全。

如果觉得断言检查太直接,可以使用at。

at在遇到越界时,会抛异常:

容器(string虽然不是容器,但是行为很像容器)中有成员函数size()、length(),都能获取元素个数。


但我们更常用size(),因为这样更好理解,比如树是由一个一个节点构成的,说length()比较奇怪。

对于修改和遍历,还有另一种方法:迭代器。

2.4.1、迭代器简单了解

迭代器,是一种行为像指针的东西。


由于我们在上面用for循环将s1的每一个字符都+1,这里演示迭代器时就将s1变回去了。

上图中使用了begin()、end()。他俩都是函数模板,返回的都是一个迭代器。

我们可以理解为:begin()指向s1的第一个字符,end()指向的是s1最后一个字符的下一个位置。

迭代器行为像指针,但是迭代器底层并不一定是完全用指针实现的。迭代器底层实现可能借助了指针。

2.4.1.1、const迭代器

迭代器作用的对象,可能是可以被修改的,也可能是不可以被修改的。所以我们就需要const迭代器。

但是这样写,就不对了。

因为迭代器是用来迭代对象,来进行对对象的遍历和修改的,也就意味着迭代器必须被修改。所以const直接作用在迭代器上是不对的。

正确写法:

使用const迭代器:const_iterator。

2.4.1.2、反向迭代器

反向迭代器和迭代器的用法很类似:

反向迭代器reverse_iterator使用了模板rbegin()、rend(),其中rbegin()对应end()的功能,rend()对应begin()的功能,所以打印出来的语句是颠倒的。

2.4.1.3、迭代器优点的简单讨论

迭代器提供了统一的方式处理各个容器,那么我们就不需要自己实现迭代的方法。

所以,C++标准库里的算法可以泛型化,算法借助了迭代器实现:

相关推荐
Kurisu_红莉栖17 小时前
c++的复习——多态
开发语言·c++
草莓熊Lotso17 小时前
手搓工业级 C++ 线程安全日志系统:基于策略模式解耦,兼容 glog 使用风格
linux·运维·服务器·数据库·c++·安全·策略模式
pearlthriving17 小时前
STL容器及其底层
开发语言·c++·算法
Byte不洛17 小时前
深入理解C++多态机制:虚函数、虚表与对象内存模型解析
c++·多态·对象模型·虚函数表·虚基表
leaves falling17 小时前
C++ 继承详解:从入门到深入
开发语言·c++
minji...17 小时前
Linux 网络基础(一)认识协议,网络协议,网络协议分层框架搭建,网络传输基本流程,跨网络的数据传输
linux·运维·服务器·网络·c++·网络协议
吃着火锅x唱着歌17 小时前
深度探索C++对象模型 学习笔记 第四章 Function语意学(1)
c++·笔记·学习
王老师青少年编程17 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【排序贪心】:纪念品分组
c++·算法·贪心·csp·信奥赛·排序贪心·纪念品分组
tankeven17 小时前
C++ 学习杂记03:std::string 类
c++
H_BB18 小时前
动态规划详解
c++·算法·动态规划