C++STL之vector的自定义实现

C++STL之vector的自定义实现

2018.10.15-至今一直在寻找C++开发岗位的工作,但是刚毕业,没有工作经验与项目经历,工作一直不太好找。聊天中有个朋友说你把STL自己实现一下,放在博客上,简单的当作自己的项目。于是就写了这篇博客。

如有用词不当或者错误之处,请联系我改正

注意点:
1、如果是像本文一样采取类模板template(泛型)来实现,则类的实现与类的声明要放在同一个文件中,否则即使你 #include"xxx.h" 了,在编译时也会提示“无法解析的外部符号”。
2、vector容器自身涉及到insert与erase,因此赋值操作必不可少,本篇博客是实现时暂未考虑到复杂数据类型,即仅仅支持简单的char、double等基本数据类型。有机会会单独发一篇博客来实现支持复杂数据类型(如class、struct)的代码。
3、目前为止,自定义容器的常用功能如resize()、reserve()、erase()和insert()的重载均为实现,后续研究出来会更新的。
4、暂时不给出测试代码,实际上测试法与vector容器 用法相同,但是应该不支持迭代器(iterator),请谨慎使用begin()、end()等函数的返回值。
5、本文开发环境 VS2013。

类MyVector的声明

template<class T>
class MyVector{
public:
	MyVector<T>();
	~MyVector<T>();
	
	int size();
	int capacity();
	void clear();
	bool empty();
	void swap(MyVector<T>& v);
	T at(int index);
	void push_back(T v);
	void pop_back();
	
	void two();				//容器自增长

	T* begin();
	T* end();
	T front();

	T* erase(T* pos);//删除指定位置的元素,返回下一个元素的位置
	//T* erase(T* start,T* end);//删除指定区间的元素,返回end对应元素的位置

	T* insert(T* pos, T val);//返回val所在的位置
	void insert(T* pos, int count, T val);//在pos位置插入count个val
private:
	T* data;	 //数组用于存放元素
	int Size;	 //实际个数
	int Capacity;//现有的容量

};

类模板MyVector的外部实现
构造与析构

template<class T>
MyVector<T>::MyVector(){
	Size = 0;
	Capacity = 10;
	data = new T[Capacity];
}
template<class T>
MyVector<T>::~MyVector(){

}

size()、capacity()、empty()、clear()的实现

template<class T>
int MyVector<T>::size(){
	return this->Size;
}
template<class T>
int MyVector<T>::capacity(){
	return this->Capacity;
}
template<class T>
bool MyVector<T>::empty(){
	return (Size == 0);
}
template<class T>
void MyVector<T>::clear(){
	while (!empty())
		pop_back();
}


at()、push_back()、pop_back()的实现

template<class T>
T MyVector<T>::at(int index){
	if (empty() || index > Capacity)//空 下标越界
		return (T)NULL;
	return data[index];
}
template<class T>
void MyVector<T>::push_back(T v){
	//two();
	data[Size++] = v;
}
template<class T>
void MyVector<T>::pop_back(){
	if (empty())//空不可删除
		return;
		//throw runtime_error("empty");
	//data[Size - 1] = (T*)NULL;
	--Size;
}

容器自增长two()、swap()的实现

template<class T>
void MyVector<T>::two(){
	if (size() > capacity()){
		Capacity *= 2;
		T* old = this->data;
		data = new T[Capacity];
		for (int i = 0; i < Size; ++i)
			data[i] = old[i];
		delete[]old;
	}
}
template<class T>
void MyVector<T>::swap(MyVector<T>& v){
	//考虑交换双方的元素个数
	int len = size();
	T* tmp = new T[len];//将自身的数据存储在tmp中
	for (int i = 0; i < len; ++i){
		tmp[i] = at(i);
	}
	clear();
	for (int i = 0; i < v.size(); ++i){
		push_back(v.at(i));
	}
	v.clear();
	for (int i = 0; i < len; ++i)
		v.push_back(tmp[i]);
}

front()、begin()、end()的实现

template<class T>
T MyVector<T>::front(){
	if (!empty()){
		return data[0];
	}
	else
		return (T)NULL;
}
template<class T>
T* MyVector<T>::begin(){
	if (!empty()) 
		return data;
	else
		return (T*)NULL;
}
template<class T>
T* MyVector<T>::end(){
	if (!empty())
		return data + Size;
	else{
		cout << "空" << endl;
		return (T*)NULL;
	}
}

insert()、erase()的实现

template<class T>
T* MyVector<T>::erase(T* pos){//
	T* p=pos;
	T* tmp = pos + 1;
	while (tmp != end()){
		*pos = *tmp;
		++pos;
		++tmp;
	}
	--Size;
	return p;
}

template<class T>
T* MyVector<T>::insert(T* pos, T val){
	if (Size + 1 > Capacity)
		two();//容量不够时,自增长
	T* p = end();
	int i = 0;
	for (i = Size; p != pos; --i, --p){
		data[i] = data[i - 1];
	}
	data[i] = val;
	++Size;
	return pos;
}
//该函数目前存在bug,当Capacity初始化过小时,会发生“中断”
template<class T>
void MyVector<T>::insert(T* pos, int count, T val){
	Size += count;
	while (size() > capacity()){
		two();//容量不够时,自增长
		cout << size() << " " << capacity() << endl;
	}
	T* p = (T*)NULL;
	int i = 0,j=0;
	for (i = size() - 1; data[i]!=*(pos-1); --i){
		data[i+count] = data[i];
	}
	for (p = pos; p < pos +count; ++p)
		*p = val;
}
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值