vector底层实现及深层次拷贝问题

文章介绍了如何自定义实现C++中的vector容器,包括其大体框架、接口实现,特别是拷贝构造函数和深拷贝问题。在接口实现中,详细展示了vector的基本操作如构造、赋值、大小调整等。在深拷贝问题部分,分析了二维vector在扩容时由于浅拷贝导致的问题,并提出了通过深拷贝解决的方案,即利用operator=重载进行元素逐个复制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

大框架

接口实现

深层次拷贝问题(两次深拷贝)


大框架

为了与库里实现的更接近一些,先来看一下STL中是如何实现vector的(这里不是PJ版,PJ版稍微晦涩一点不容易理解,这里采用Linux下g++的版本)这里仅就大体框架做个简单介绍,其中复杂的概念不做过多解释。

 首先是vector定义的模板参数T和Alloc,这是空间配置器是一种底层实现机制,使用角度不用管。

可以看到源码做了很多typedef,主要是对格式的控制和方便理解编写。其中将T* typedef成了iterator,这个要注意,后面protected 成员变量会用到。

 这里成员变量就用到了刚刚typedef的iterator,实际上就是T* start ; T* finish;  T* end_of_storage;

T就是实例化模板参数。好像与我们设想的变量不太一样,我们设想的应该是有size和capacity的,但是这里全部统一使用指针,其实只是改变了使用方式,本质还是一样的。

 假设存在size(有效数据个数),capacity(容量),那么finish也可以表示成start+size,end_of_storage也可以表示成strat+capacity,本质是一样的。

后面是各个接口的实现,后面我们自己实现的时候具体说明,先把大框架搭建起来。

namespace bc
{
	template<class T>
	class vector
	{
	public:
		typedef T* iterator;

	private:
		iterator _start;
		iterator _finish;
		iterator _end_of_storage;
	};
}

为了避免和库里的冲突,将我们的实现代码封在命名空间内,库里的繁杂的typedef我们省略,只保留基本的T* 的重命名和成员变量表示。

接口实现

vector.h

#pragma once

#include<iostream>
#include<vector>
#include<assert.h>

using namespace std;

namespace bc
{
	template<class T>
	class vector
	{
	public:
		typedef T* iterator;
		vector()
			:_start(nullptr)
			, _finish(nullptr)
			, _end_of_storage(nullptr)
		{ }

		//拷贝构造写法一
		//vector(const vector<T>& v)
		//	: _start(nullptr)
		//	, _finish(nullptr)
		//	, _end_of_storage(nullptr)
		//{
		//	reserve(size());
		//	for (auto& e : v) {
		//		push_back(e);
		//	}
		//}


		//拷贝构造现代写法
		template<class InputIterator>
		vector(InputIterator first, InputIterator last) 
			: _start(nullptr)
			, _finish(nullptr)
			, _end_of_storage(nullptr)
		{
			while (first != last) {
				push_back(*first);
				first++;
			}
		}

		vector(vector<T>& v) 
			: _start(nullptr)
			, _finish(n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值