本文主要是介绍string类深浅拷贝,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
1 .string类
2. string类对象的常见构造
3. string类对象的容量操作
4. string类对象的修改操作
5.浅拷贝:
6.深拷贝
1 .string类
- 1. string是表示字符串的字符串类
- 2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
- 3. string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator> string;
- 4. 不能操作多字节或者变长字符的序列。
- 在使用string类时,必须包含<string>头文件,STL中的容器都是定义在std这个标准命名空间,因此使用的时候需要using namespace std;
2 .string类对象的常见构造
- string() :构造空的string类对象,即空字符串
- string(const char* s) :用C语言的字符串来构造string类对象
- string(size_t n, char c) :string类对象中包含n个字符c
- string(const string&s) :拷贝构造函数
- string (const string& str, size_t pos, size_t len = npos);子字符串构造函数,复制从字符位置 pos 开始并跨越 len 字符的 str 部分(如果 str 太短或 len 是 string::npos,就拷贝到 str 的末尾)。
- npos:
- npos 是一个静态成员常量值,对于类型为 size_t 的元素,具有最大可能的值。
- 此常量使用值 -1 定义,因为size_t是无符号整数类型,因此它是此类型的最大可能可表示值,即无符号的oxffffffff。
3. string类对象的容量操作
- size:返回字符串有效字符长度
- length:返回字符串有效字符长度
- size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。
- capacity:返回空间总大小
- empty :检测字符串释放为空串,是返回true,否则返回false
- clear:清空有效字符。
- clear()只是将string中有效字符清空,不改变底层空间大小。
- reserve :为字符串预留空间
- 例如:
- void reserve (size_t newcapacity):扩容
- 假设:string底层空间大小为oldcapacity
- 当newcapacity <= oldcapacity:直接忽略oldcapacity>15
- 当newcapacity > oldcapacity:才会真正进行扩容---注意:reserve只改变容量,不会修改有效元素个数(1.开辟新空间2.拷贝元素3.释放旧空间4.使用新空间)
- 当reserve的参数小于string的底层空间总大小时,reserve不会改变容量大小
- resize :将有效字符的个数该成n个,多出的空间用字符c填充
- 例如:
- s.resize(n,ch)
- 如果 n 小于当前s中有效元素的个数,将s中有效元素个数减少到n个,从而删除超出 n 个字符的字符,但是总容量s.capacity()不变。
- 如果 n 大于当前s中有效元素的个数,将s中有效元素个数增加到n个,多出的元素使用ch来填充,在增多的过程中如果n>s.capacity(),需要扩容(按照内部的机制扩容),如果调用void resize (size_t n),则多出来的字符用空字符填充。
- resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。
- 所有内置类型在其之后直接跟上( )的结果都是0
- 3. string类对象的访问及遍历操作
- operator[] :运算符[ ]的重载,返回pos位置的字符,const string类对象调用
- 当用 [ ]越界访问时,operator[ ]是用断言来触发的
- 当用at( )越界访问时,是用异常来处理的
- 迭代器:
- 迭代器的意义:像string,vector支持[ ]遍历,但是list,map等容器不支持[ ] ,迭代器是一种统一的方式
- 正向迭代器begin() ,end():begin()获取第一个字符的迭代器 , end()获取最后一个字符下一个位置的迭代器
- string::iterator写起来比较长,可以用auto代替,让编译器自己去推演类型
- const_iterator begin( ) const;只能读,不能写
- 逆置算法
- 将[first,last)区域反转
- 反向迭代器rbegin(), rend() :rbegin()获取最后一个字符的迭代器 ,rend()获取第一个字符的前一个位置的迭代器
- 范围for:C++11支持更简洁的范围for的新遍历方式
- operator[] :运算符[ ]的重载,返回pos位置的字符,const string类对象调用
4. string类对象的修改操作
- push_back:在字符串后尾插字符c
- append:在字符串后追加一个字符串
- operator+= :在字符串后追加字符串或者字符
- c_str:返回C格式字符串
- find + npos:从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
- rfind:从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
- substr:在str中从pos位置开始,截取n个字符,然后将其返回
- getline:接收整行字符串(如果是接收单个字符串,直接用cin就行)
- string类比较大小,可以直接用运算符,因为运算符都重载过了
- 算法:isalpha:检测一个字符是否时字母
- 算法:isalnum:检测一个字符是否是十进制数字还是大写或小写字母。
5.浅拷贝:
6.深拷贝
- 传统写法
- 现代版写法
- 拷贝构造函数
- 赋值运算符重载
- 赋值运算符重载第二版本
- 拷贝构造函数
- 浅拷贝+引用计数+写时拷贝(简易版)
这篇关于string类深浅拷贝的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!