首页 > 其他分享 >STL的深浅拷贝问题

STL的深浅拷贝问题

时间:2024-02-21 17:37:42浏览次数:20  
标签:容器 mc STL len 深浅 myclass 拷贝 data

STL的深浅拷贝问题

​ STL容器所提供的都是值(value)寓意,而非引用(reference)寓意,也就是说当我们给容器中插入元素的时候,容器内部实施了拷贝动作,将我们要插入的元素再另行拷贝一份放入到容器中,而不是将原数据元素直接放进容器中,也就是说我们提供的元素必须能够被拷贝

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
usingnamespace std;

class myclass{
public:
	myclass(char* data){
		int len = strlen(data) + 1;      //计算传进来的字符串长度
		this->data =newchar[len];        //在堆区分配了len字节内存
		strcpy(this->data, data);        //将数据拷贝到我们在堆分配的内存中
	}
	//增加拷贝构造函数
	myclass(const myclass& mc){
		int len = strlen(mc.data) + 1;
		this->data =newchar[len];
		strcpy(this->data, mc.data);
	}
	//重载operator=操作符
	myclass& operator=(const myclass& mc){
       if (this->data != NULL){
			delete[] this->data;
			this->data = NULL;
		}
		int len = strlen(mc.data) + 1;
		this->data =newchar[len];
		strcpy(this->data, mc.data);
		return*this;
	}
  
	//既然我们在堆区分配了内存,需要在析构函数中释放内存
	~myclass(){
		if(NULL!=this->data){
			delete[]this->data;
			this->data =NULL;
		}
	}
private:
	char* data;
};

void test_deep_copy(){
	char* data ="abcd";
	myclass mc(data);    //创建myclass的实例 并用char*字符串data初始化对象

	vector<myclass> v;   //创建vector容器
	v.push_back(mc);     //将mc实例插入到vector容器尾部

}

int main(){

	test_deep_copy();//调用测试函数
	return0;
}

1.把对象放入容器,其实是拷贝一份对象到容器。

2.注意:

​ 1.拷贝构造要能被调用
​ 2.注意要浅拷贝问题

标签:容器,mc,STL,len,深浅,myclass,拷贝,data
From: https://www.cnblogs.com/wbcde116/p/18025793

相关文章

  • 最简单的深拷贝和浅拷贝(原理)
    拷贝:其实就是一个对象复制给另外一整个对象,让对象相互不影响。对象的拷贝又分为浅拷贝和深拷贝对象的浅拷贝:浅拷贝是指只复制对象的第一层属性,如果对象的属性值是引用类型(如对象、数组等),则复制的是引用,而不是真正的拷贝。对象的深拷贝:深拷贝是指在复制对象时,不仅复制对象本身,还......
  • C++ 深拷贝浅拷贝
    C++深拷贝浅拷贝C++默认生成的拷贝构造函数,他的行为就是浅拷贝,他只会复制一个一模一样的的指针,并不会操作指针指向的东西。要想实现我们的逻辑需求,就要自定义拷贝构造函数,实现深拷贝。我们来具体说明一下上面的话首先我们创建一个简单的类#include<iostream>usingnamespa......
  • STL简介
    01.STL的介绍(重点)1.STL(StandardTemplateLibrary,标准模板库)2.STL提供了六大组件:容器,算法,迭代器,仿函数,适配器,空间配置器​ 容器:各种数据结构​ 算法:各种常用的算法(冒泡,排序)​ 迭代器:扮演了容器与算法之间的胶合剂(类似于指针等)​ 仿函数:行为类似函数,可作为算法的某种策略......
  • C++ STL map
    map<int,string>MyMap;//下标方式key值重复进行替换MyMap[0]="233";MyMap[0]="23333";//insert方法key值重复无法插入MyMap.insert(pair<int,string>(1,"zhangsan"));MyMap.insert(pair<int,string>(1,"zhangsan2"))......
  • C++左值引用、右值引用、移动语义、完美转发、深浅拷贝
    一、左值和右值定义(能否取地址)1.左值:可以取地址的对象2.右值:不可以取地址、临时要销毁的对象二、左值引用1.定义:对左值的引用int&ra=a;2.作用:传递参数和返回值时减少不必要的拷贝三、右值引用1.定义:对右值的引用//以下是对几种右值的右值引用int&&rr1=10;doubl......
  • c++定义类的时候,只提供拷贝构造函数而不提供默认(无参)构造函数和有参构造函数会怎样?
    4.2.4构造函数调用规则默认情况下,c++编译器至少给一个类添加三个函数:默认构造函数(无参,函数体为空)默认析构函数(无参,函数体为空)默认拷贝构造函数(对属性进行值拷贝)构造函数调用规则:如果用户定义有参构造函数,编译器不会提供默认(无参)构造,但是会提供默认拷贝构造函数如果用户......
  • 类属性转换 拷贝 赋值
    参考链接 https://www.cnblogs.com/CodeBlogMan/p/18005657 三、类属性转换在实际Java开发中,关于VO、Entity、DTO等对象属性之间的赋值是我们经常遇见的,最简单使用@Data去逐个.set()或者@Builder链式.build(),其实都是很靠谱的办法,而且可以控制颗粒度。但属性一多......
  • 【C++】STL string类例题新思路记录(编写一个程序,告诉用户输入的句子包含多少个元音字
    题干:编写一个程序,告诉用户输入的句子包含多少个元音字母。 方案一:1、创建一个普通函数,依次传入5个元音字母对查找字符串进行检测。2、函数通过依次传入的单个元音字母,循环查找整个字符串最后返回统计值。1#include<string>2#include<iostream>3usingnamespace......
  • js 双对象对比拷贝数据
    应用场景:1、两个深层次对象2、第一个对象为模板对象,第二个对象为返回的实际数据对象(简称实例对象)3、如果一个属性在实例对象内,就拿取实例对象的这个属性;如果没有,就从模板对象里面拿取。如果某个属性是数组对象,那么实例对象的这个属性内每一个数组对象都要与模板对......
  • 下载、安装Git并拷贝GitHub项目到本地的流程
      本文介绍分布式开源版本控制系统Git的下载、安装,并基于Git实现克隆GitHub中项目代码的方法。  Git是一款开源软件,因此我们直接在Git的官方下载地址下载最新版本的Git即可。其中,在下图所示的位置选择适合我们操作系统的Git版本。  随后,选择下图红色方框内的内容,下载最新......