自学内容网 自学内容网

C++基础:string(4)和vector的基础使用

在这里插入图片描述

1.string的拷贝构造和赋值重载

1.拷贝构造

之前我们已经看过如果不进行写拷贝构造就会出现问题:

  1. 默认的浅拷贝会按照字节拷贝导致两个指向同一块空间会析构两次
  2. 其中一个修改会影响另一个

image-20241102090101928

用S1创建一个tmp临时对象,让tmp构造出目标对象,将tmp和S2交换也可以实现拷贝构造

image-20241102092245770

代码也很简单:

string(const string& s)
{
string tmp(s._str);
swap(_str, tmp._str);
swap(_size, tmp._size);
swap(_capacity, tmp._capacity);
}

优化一下:

void swap(string& s)
{
std::swap(_str, s._str);
std::swap(_size, s._size);
std::swap(_capacity, s._capacity);
}
string(const string& s)
{
string tmp(s._str);
swap(tmp);
}

image-20241102094046502

2.赋值重载

那我们的赋值重载是不是也能用swap来写呢?

也是可以的我们来看看思路:

image-20241102093936497

代码实现:

string& operator=(const string& s)
{
if (this != &s)
{
string tmp(s._str);
swap(tmp);
}
return *this;
}

image-20241102094012232

我们甚至可以去调用拷贝构造,来实现代码的优化

string& operator=(string tmp)
{
swap(tmp);
return *this;
}

注意这里建议不要直接用C++98中的swap函数因为会进行三次深拷贝导致效率问题

image-20241102100751582

3.引用计数(写时拷贝)

那能不能不进行拷贝,直接进空间进行管理呢?

1730863134888

但是这样有问题:

  1. 如果s1对空间进行修改那,s2指向的内容也就会该改变,那这个该如何解决呢?

    没有任何办法,只能将其进行深拷贝,拷贝后才能进行修改

  2. 析构两次

2.vector的基本介绍

1. 基本构造

image-20241107093518140

2. 遍历vector

在vector中也可以用下标访问,而且也有size函数

有三种方式可以遍历:

  1. 下标加[]
  2. 迭代器
  3. 范围for

1730877941732

3. vector增删改查

3.1 vector::resize

1731306366871

1731306569049

1731307097949

3.2 vector::push_backvector::insert

1731307396963

1731307315086

注意这里的vector::insert只支持迭代器了

使用方法如下:

1731307607998

3.3vector<vector<int>>

图解如下

image-20241112165925434

  1. 其中内部的vector存放的是vector<int>的相关数据内容
  2. 外面的vector存放的是指向内部数据记录的先关指针

就像一个二位指针数组一样,具体使用方法如下:

image-20241112171819217

题目练习: 118. 杨辉三角 - 力扣(LeetCode)

image-20241112172545309

这道题目就用到了上面所说的vector<vector<int>>

解题方法如下:

class Solution {
public:
vector<vector<int>> generate(int numRows) 
{
vector<vector<int>> vv(numRows);
for (int i = 0; i < numRows; i++) 
{
vv[i].resize(i + 1, 1);
}
for (int i = 2; i < vv.size(); i++) 
{
for (int j = 1; j < vv[i].size() - 1; j++) 
{
vv[i][j] = vv[i - 1][j] + vv[i - 1][j - 1];
}
}
return vv;
}
};

原文地址:https://blog.csdn.net/2302_82004664/article/details/143729278

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!