string类【深浅拷贝】

本文介绍了C++中的string类,包括其接口、操作、构造函数、拷贝构造函数、深浅拷贝的概念以及如何模拟实现string类。通过实例分析了浅拷贝可能导致的问题,并详细解释了深拷贝的必要性和实现方法。最后提到了写时拷贝的概念,作为解决资源管理的一种优化策略。
摘要由CSDN通过智能技术生成
了解
  1. string是表示字符串的字符串类
  2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作
  3. string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator> string;
  4. 不能操作多字节或者变长字符的序列

在使用string类时,必须包含#include头文件以及using namespace std;

操作:

构造

  • 空字符串:string()
  • 用字符串构造:string(const char* s)
  • 构造n个字符c:string(size_t n,char c)
  • 拷贝构造:string(const string& s)

容量相关

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

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

遍历、访问

  • operator[]:直接访问一位置的字符
  • begin+ end:begin获取一个字符的迭代器/end获取最后一个字符下一个位置的迭代器
  • rbegin + rend:begin获取一个字符的迭代器/end获取最后一个字符下一个位置的迭代器
  • 范围for:C++11支持的范围for新遍历方式
//三种遍历方式
void TestString()
{
   
 string s("Hello world");
 //1
 string::iterator it=s.begin();
 while(it!=s.end())
{
   
	cout<<*it<<" ";
	++it;
}
cout<<endl;

string::reverse_iterator rit=s.rbegin();
while(rit!=s.rend())
{
   
	cout<<*rit<<" ";
	--rit;
}
cout<<endl;

 //2
 for(auto c:s)
 	cout<<c<<" ";
 cout<<endl;
 }
 //3
 for(size_t i=0;i<s.size();i++)
 	cout<<s[i]<<" ";
 cout<<endl;

修改

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

非成员函数

  • operator+:【传值返回,深拷贝效率低】
  • operator>>:输入运算符重载
  • operator<<:输出运算符重载
  • getline:获取一行字符串
  • relational operators:大小比较
模拟实现string类

对于实现一个类,主要是实现构造函数、拷贝构造函数、赋值运算符的重载、析构函数

class String
{
   
public:
	String(const char* str="")
	{
   
	//如果传一个空指针,程序非法,需要进行断言
		if(nullptr==str)
		
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值