深浅拷贝及STL共性

浅拷贝

  • 浅拷贝由于拷贝后共用同一个地址,有些时候会析构两次,造成程序宕掉
  • 浅拷贝的是调用的STL默认构造函数

深拷贝

  • 深拷贝是使用者自定义的拷贝构造函数
  • 深拷贝往往新分配一个地址内存

浅拷贝和深拷贝代码

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<map>
#include<string>
using namespace std;


class Person
{
public:
	Person(const char* name, int age)
	{
		this->pName = new char[strlen(name) + 1];
		strcpy(this->pName, name);
		this->mAge = age;
	}
    //删去这一部分就是浅拷贝,程序会宕掉
	Person(const Person& p)
	{
		this->pName = new char[strlen(p.pName) + 1];
		strcpy(this->pName, p.pName);
		this->mAge = p.mAge;
	}
	Person& operator=(const Person& p)
	{
		if (this->pName != NULL)
		{
			delete[] this->pName;
		}
		this->pName = new char[strlen(p.pName) + 1];
		strcpy(this->pName, p.pName);
		this->mAge = p.mAge;
		return *this;
	}

	~Person()
	{
		if (this->pName != NULL)
		{
			delete[] this->pName;
		}
	}
public:
	char* pName;//指针容易出现浅拷贝问题
	int mAge;
};

void test01()
{
	Person p("aaa", 20);
	vector<Person> vPerson;
	vPerson.push_back(p);//传地址进去,浅拷贝

}


int main(void)
{
	test01();

	return 0;
}

STL容器共性

  • STL所提供的都是值(value)寓意,而非引用寓意,
  • 当往容器中插入元素时,容器内部实施了拷贝动作,将要插入的元素再另行拷贝一份放入容器元素中,而不是将原元素直接放入容器中
  • 提供的元素要必须能够被拷贝
  • 除了queue和stack外,每一个容器都可以提供返回迭代器的函数,运用返回迭代器函数可以访问容器元素
  • STL通常不会抛出异常,需要使用者传入正确的参数

STL容器使用时机

vectordequelistsetmultisetmapmultimap
典型内存结构单端数组双端数组双向链表二叉树二叉树二叉树二叉树
可随机存取对key是
元素搜寻速度非常慢对key而言:快对key而言:快
元素插入移除尾端头尾两端任何位置由规则定由规则定由规则定由规则定

STL容器使用场景

  • vector的使用场景:比如软件历史操作记录的存储,我们经常看历史记录,但不会去删除记录,因为记录是事实的描述
  • deque的使用场景:比如排队购票系统,对排队者的存储可以采用deque,支持头端的快速移除,尾端的快速添加。如果采用vector,则头端移除时会移动大量的数据,速度慢。
  • vector与deque的比较:
    • vector.at()比deque.at()效率高,比如vector.at(0)是固定的,deque的开始位置却是不固定的
    • 如果有大量释放操作的话,vector花的时间更少这跟二者的内部实现有关
    • deque支持头部的快速插入和快速删除,这是que的优点
  • list使用场景:比如公交车乘客的存储,随时有可能有乘客下车,支持频繁的不确定位置元素的移除和插入
  • set的使用场景:比如游戏个人得分记录的存储,存储要求顺序排列
  • map的使用场景:比如ID好存储十万个用户,想要快速通过ID查找对应的用户,二叉树的查找速率,体现在此,如果是vector最坏情况可能需要遍历整个容器才能查找到用户
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr_Csyn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值