C++基础:string(4)和vector的基础使用
文章目录
1.string的拷贝构造和赋值重载
1.拷贝构造
之前我们已经看过如果不进行写拷贝构造就会出现问题:
- 默认的浅拷贝会按照字节拷贝导致两个指向同一块空间会析构两次
- 其中一个修改会影响另一个
用S1创建一个tmp临时对象,让tmp构造出目标对象,将tmp和S2交换也可以实现拷贝构造
代码也很简单:
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);
}
2.赋值重载
那我们的赋值重载是不是也能用swap
来写呢?
也是可以的我们来看看思路:
代码实现:
string& operator=(const string& s)
{
if (this != &s)
{
string tmp(s._str);
swap(tmp);
}
return *this;
}
我们甚至可以去调用拷贝构造,来实现代码的优化
string& operator=(string tmp)
{
swap(tmp);
return *this;
}
注意这里建议不要直接用C++98中的swap函数因为会进行三次深拷贝导致效率问题
3.引用计数(写时拷贝)
那能不能不进行拷贝,直接进空间进行管理呢?
但是这样有问题:
-
如果s1对空间进行修改那,s2指向的内容也就会该改变,那这个该如何解决呢?
没有任何办法,只能将其进行深拷贝,拷贝后才能进行修改
-
析构两次
2.vector的基本介绍
1. 基本构造
2. 遍历vector
在vector中也可以用下标访问,而且也有size
函数
有三种方式可以遍历:
- 下标加[]
- 迭代器
- 范围for
3. vector增删改查
3.1 vector::resize
3.2 vector::push_back
和 vector::insert
注意这里的vector::insert
只支持迭代器了
使用方法如下:
3.3vector<vector<int>>
图解如下
- 其中内部的vector存放的是
vector<int>
的相关数据内容 - 外面的vector存放的是指向内部数据记录的先关指针
就像一个二位指针数组一样,具体使用方法如下:
题目练习: 118. 杨辉三角 - 力扣(LeetCode)
这道题目就用到了上面所说的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)!