我是靠谱客的博主 鲜艳发箍,最近开发中收集的这篇文章主要介绍深浅拷贝及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最坏情况可能需要遍历整个容器才能查找到用户

最后

以上就是鲜艳发箍为你收集整理的深浅拷贝及STL共性的全部内容,希望文章能够帮你解决深浅拷贝及STL共性所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部