概述
浅拷贝
- 浅拷贝由于拷贝后共用同一个地址,有些时候会析构两次,造成程序宕掉
- 浅拷贝的是调用的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容器使用时机
vector | deque | list | set | multiset | map | multimap | |
---|---|---|---|---|---|---|---|
典型内存结构 | 单端数组 | 双端数组 | 双向链表 | 二叉树 | 二叉树 | 二叉树 | 二叉树 |
可随机存取 | 是 | 是 | 否 | 否 | 否 | 对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最坏情况可能需要遍历整个容器才能查找到用户
最后
以上就是鲜艳发箍为你收集整理的深浅拷贝及STL共性的全部内容,希望文章能够帮你解决深浅拷贝及STL共性所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复