前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ 自己实现vector容器

C++ 自己实现vector容器

原创
作者头像
村子里的设计师
发布2023-04-15 16:09:35
3000
发布2023-04-15 16:09:35
举报
文章被收录于专栏:程序设计a程序设计a
代码语言:javascript
复制

#include <initializer_list>
namespace my{
template<typename T>
class Alloctor {
public:
	T* allocate(size_t length) {
		cout << " Malloc " << length << endl;
		return (T*)malloc(sizeof(T)*length); // malloc方法返回void*, (T*)void* 是将void*转为T*类型,void*是无类型的指针。
	}
	void deallocate(T* p) {
		cout << " Dealloc " << p << endl;
		free(p); // free 方法不需要指定长度,malloc的真实长度只有自己知道,申请部分的头部应该记录了申请大小。
	}
	
	void construct(T* p, const T& val) { // 在p地址上 执行T(val)的构造函数
		cout << "Construct" << endl;
		new (p)T(val);
	}
	void destroy(T* p) {
		cout << "destroy" << endl;
		//delete p; 只能从malloc返回的指针开始释放,不能释放一部分,这是free要求的。delete=free+destructor
		p->~T();
	}
};

template<typename T>
class vector {
public:
	vector() : begin_(nullptr), end_(nullptr), end_of_storage_(nullptr), alloc(nullptr) {}
	vector(size_t size) {
		cout << "constructor(size)" << endl;
		alloc = new Alloctor<T>;
		begin_ = alloc->allocate(size);
		end_ = begin_;
		end_of_storage_ = begin_ + size;
	}
	vector(const vector<T>& vec) {
		cout << "copy, const&" << endl;
		alloc = new Alloctor<T>;
		size_t size = vec.end_ - vec.begin_;
		begin_ = alloc->allocate(size);
		end_ = begin_ + size;
		end_of_storage_ = end_;

		T* cur = begin_;
		for (T* p = vec.begin_; p != vec.end_; ++p, ++cur) {
			alloc->construct(cur, *p);
		}
	}
	vector(vector<T>&& vec) {
		cout << "copy, &&" << endl;
		begin_ = vec.begin_;
		end_ = vec.end_;
		end_of_storage_ = vec.end_of_storage_;
		alloc = vec.alloc;

		vec.begin_ = nullptr;
		vec.end_ = nullptr;
		vec.end_of_storage_ = nullptr;
		vec.alloc = nullptr;
	}
	vector(const std::initializer_list<T>& list) {
		size_t size = list.size();
		alloc = new Alloctor<T>;
		begin_ = alloc->allocate(size);
		end_ = begin_ + size;
		end_of_storage_ = end_;

		T* iter = begin_;
		for (const auto& val: list) {
			alloc->construct(iter, val);
			iter++;
		}
	}
	vector<T>& operator=(const vector<T>& vec) { // ??? 返回值不需要模板?
		cout << "operator, &" << endl;
		if (this == &vec) return *this;
		alloc->deallocate(begin_);
		delete alloc;

		alloc = new Alloctor<T>;
		size_t size = vec.end_ - vec.begin_;
		begin_ = alloc->allocate(size);
		end_ = begin_ + size;
		end_of_storage_ = end_;
		
		T* cur = begin_;
		for (T* p = vec.begin_; p != vec.end_; ++p) {
			alloc->construct(cur, *p);
		}

		return *this;
	}
	vector<T>& operator=(vector<T>&& vec) {
		cout << "operator, &&" << endl;
		begin_ = vec.begin_;
		end_ = vec.end_;
		end_of_storage_ = vec.end_of_storage_;
		alloc = vec.alloc;
		
		vec.begin_ = nullptr;
		vec.end_ = nullptr;
		vec.end_of_storage_ = nullptr;
		vec.alloc = nullptr;
		return *this;
	}

	~vector() {
		cout << "destruct vector" << endl;
		alloc->deallocate(begin_); // 可以delete, free空指针,但是不能是野指针
		delete alloc;
	}

	void push_back(const T& val) {
		cout << "push" << endl;
		if (end_ == end_of_storage_) {
			resize();
		}
		alloc->construct(end_, val);
		end_ += 1;
	}

	void pop_back() {
		cout << "pop" << endl;
		if (end_ == begin_) return;
		alloc->destroy(--end_);
	}

	T& operator[](size_t index) {
		return *(begin_+index);
	}	

private:
	T* begin_;
	T* end_; // [)
	T* end_of_storage_; // [)
	Alloctor<T>* alloc; // 注意释放

	void resize() {
		cout << "---- Resize ----" << endl;
		size_t size = end_of_storage_ - begin_;
		T* new_begin = alloc->allocate(2*size? size != 0 : 4);
		T* new_ptr = new_begin;
		for (T* p = begin_; p != end_; ++p, ++new_ptr) {
			alloc->construct(new_ptr, *p);
		}
		alloc->deallocate(begin_);
		begin_ = new_begin;
		end_ = new_begin + size;
		end_of_storage_ = begin_ + 2 * size;
	}

};

void test() {
	vector<int> vec1;
	vector<int> vec2(2);
	vector<int> vec3(vec2);
	vec2.push_back(1);
	vec2.push_back(2);
	cout << vec2[0] << " " << vec2[1] << endl;
	vector<int> vec4 = vec2;
	vec1 = vec2;
	vec4.pop_back();
	cout <<vec4[0] << " " << endl;
	vec2.push_back(3);
	vector<int> vec5 = std::move(vec3);
	vector<int> vec6 = {1, 2, 3};
	cout << "END" << endl;
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档