c++ stl库 vector简单的实现
2014-04-16 22:45
393 查看
1、类中重载了运算符“=”,返回一个对象的引用,拷贝构造函数调用了这个重载运算符;
stl库中vector是一个自动管理的动态数组;其实只要明白vector的类型是一个数组,怎么去实现它,其实就好办了;我选择了一种简单的方式去实现它;//定义一个步长(WALK_LENGTH);在数组空间不够的时候,重新申请 allocCount+WALK_LENGTH 长度的内存;这样避免了,每次vector元素增加的时候,去重新申请空间;
当然,不好的地方也很明显。就是会浪费一定的空间。但是时间效率上会提高很多;因为vector,可以支持下标访问,而且效率很快,所以没必要去构造一个iterator;
通过分析代码,可以发现vector的优缺点
1、随即访问元素效率很高;
2、push_back的效率也会很高;
3、push_front的效率则非常的低,不建议使用;
4、insert,需要把插入位置以后的元素,全部后移,效率比较低,不建议使用;
5、erase,需要把删除位置后面的元素,全部前移,效率比较低,不建议使用;
6、当内存不够的时候,需要重新申请内存,在把以前的元素拷贝过来,这个时候,效率也是比较低的
有不足的地方,还希望大家指正
#ifndef _MY_VECTOR_H_
#define _MY_VECTOR_H_
#include <assert.h>
template<typename T>
class myVector
{
private:
//walk length
//myVector each time increase space length
#define WALK_LENGTH 64;
public:
//default constructor
myVector():array(0),count(0),allocCount(0)
{
}
//
myVector(const T& t,unsigned int n):array(0),count(0),allocCount(0)
{
while(n--)
{
push_back(t);
}
}
//copy constructor
myVector(const myVector<T>& other):array(0),count(0),allocCount(0)
{
*this = other;
}
//= operator
myVector<T>& operator =(myVector<T>& other)
{
if(this == &other)
return *this;
clear();
count = other.size();
allocCount = other.allocSize();
array = new T[allocCount];
for(unsigned int i = 0 ;i<count;++i)
{
array[i] = other[i];
}
return *this;
}
//destructor
~myVector()
{
clear();
}
//the pos must be less than myVector.size();
T& operator[](unsigned int pos)
{
assert(pos<count);
return array[pos];
}
//element count
unsigned int size()
{
return count;
}
//alloc count
unsigned int allocSize()
{
return allocCount;
}
//is empty
bool empty()
{
return count == 0;
}
//clear myVector
void clear()
{
deallocator(array);
array = 0;
count = 0;
allocCount = 0;
}
//adds an element in the back of myVector
void push_back(const T& t)
{
insert_after(count-1,t);
}
//adds an element int the front of myVector
void push_front(const T& t)
{
insert_before(0,t);
}
//inserts an element after the pos
//the pos must be in [0,count);
void insert_after(int pos,const T& t)
{
insert_before(pos+1,t);
}
//inserts an element before the pos
//the pos must be less than the myVector.size()
void insert_before(int pos,const T& t)
{
if(count==allocCount)
{
T* oldArray = array;
allocCount += WALK_LENGTH;
array = allocator(allocCount);
//memcpy(array,oldArray,count*sizeof(T)):
for(unsigned int i = 0 ;i<count;++i)
{
array[i] = oldArray[i];
}
deallocator(oldArray);
}
for(int i = (int)count++;i>pos;--i)
{
array[i] = array[i-1];
}
array[pos] = t;
}
//erases an element in the pos;
//pos must be in [0,count);
void erase(unsigned int pos)
{
if(pos<count)
{
--count;
for(unsigned int i = pos;i<count;++i)
{
array[i] = array[i+1];
}
}
}
private:
T* allocator(unsigned int size)
{
return new T[size];
}
void deallocator(T* arr)
{
if(arr)
delete[] arr;
}
private:
T* array;
unsigned int count;
unsigned int allocCount;
};
#endif
下面的是测试代码
void printfVector(myVector<int>& vector1)
{
for(unsigned int i = 0 ; i < vector1.size();++i)
{
cout<<vector1[i]<<",";
}
cout<<"alloc size = "<<vector1.allocSize()<<",size = "<<vector1.size()<<endl;
}
void main()
{
myVector<int> myVector1;
myVector<int> myVector2(0,10);
myVector2.push_front(1);
myVector2.erase(11);
printfVector(myVector2);
myVector1.push_back(2);
myVector1.push_front(1);
printfVector(myVector1);
myVector1.insert_after(1,3);
printfVector(myVector1);
myVector2 = myVector1;
myVector2.insert_before(0,0);
myVector2.insert_before(1,-1);
printfVector(myVector2);
}
stl库中vector是一个自动管理的动态数组;其实只要明白vector的类型是一个数组,怎么去实现它,其实就好办了;我选择了一种简单的方式去实现它;//定义一个步长(WALK_LENGTH);在数组空间不够的时候,重新申请 allocCount+WALK_LENGTH 长度的内存;这样避免了,每次vector元素增加的时候,去重新申请空间;
当然,不好的地方也很明显。就是会浪费一定的空间。但是时间效率上会提高很多;因为vector,可以支持下标访问,而且效率很快,所以没必要去构造一个iterator;
通过分析代码,可以发现vector的优缺点
1、随即访问元素效率很高;
2、push_back的效率也会很高;
3、push_front的效率则非常的低,不建议使用;
4、insert,需要把插入位置以后的元素,全部后移,效率比较低,不建议使用;
5、erase,需要把删除位置后面的元素,全部前移,效率比较低,不建议使用;
6、当内存不够的时候,需要重新申请内存,在把以前的元素拷贝过来,这个时候,效率也是比较低的
有不足的地方,还希望大家指正
#ifndef _MY_VECTOR_H_
#define _MY_VECTOR_H_
#include <assert.h>
template<typename T>
class myVector
{
private:
//walk length
//myVector each time increase space length
#define WALK_LENGTH 64;
public:
//default constructor
myVector():array(0),count(0),allocCount(0)
{
}
//
myVector(const T& t,unsigned int n):array(0),count(0),allocCount(0)
{
while(n--)
{
push_back(t);
}
}
//copy constructor
myVector(const myVector<T>& other):array(0),count(0),allocCount(0)
{
*this = other;
}
//= operator
myVector<T>& operator =(myVector<T>& other)
{
if(this == &other)
return *this;
clear();
count = other.size();
allocCount = other.allocSize();
array = new T[allocCount];
for(unsigned int i = 0 ;i<count;++i)
{
array[i] = other[i];
}
return *this;
}
//destructor
~myVector()
{
clear();
}
//the pos must be less than myVector.size();
T& operator[](unsigned int pos)
{
assert(pos<count);
return array[pos];
}
//element count
unsigned int size()
{
return count;
}
//alloc count
unsigned int allocSize()
{
return allocCount;
}
//is empty
bool empty()
{
return count == 0;
}
//clear myVector
void clear()
{
deallocator(array);
array = 0;
count = 0;
allocCount = 0;
}
//adds an element in the back of myVector
void push_back(const T& t)
{
insert_after(count-1,t);
}
//adds an element int the front of myVector
void push_front(const T& t)
{
insert_before(0,t);
}
//inserts an element after the pos
//the pos must be in [0,count);
void insert_after(int pos,const T& t)
{
insert_before(pos+1,t);
}
//inserts an element before the pos
//the pos must be less than the myVector.size()
void insert_before(int pos,const T& t)
{
if(count==allocCount)
{
T* oldArray = array;
allocCount += WALK_LENGTH;
array = allocator(allocCount);
//memcpy(array,oldArray,count*sizeof(T)):
for(unsigned int i = 0 ;i<count;++i)
{
array[i] = oldArray[i];
}
deallocator(oldArray);
}
for(int i = (int)count++;i>pos;--i)
{
array[i] = array[i-1];
}
array[pos] = t;
}
//erases an element in the pos;
//pos must be in [0,count);
void erase(unsigned int pos)
{
if(pos<count)
{
--count;
for(unsigned int i = pos;i<count;++i)
{
array[i] = array[i+1];
}
}
}
private:
T* allocator(unsigned int size)
{
return new T[size];
}
void deallocator(T* arr)
{
if(arr)
delete[] arr;
}
private:
T* array;
unsigned int count;
unsigned int allocCount;
};
#endif
下面的是测试代码
void printfVector(myVector<int>& vector1)
{
for(unsigned int i = 0 ; i < vector1.size();++i)
{
cout<<vector1[i]<<",";
}
cout<<"alloc size = "<<vector1.allocSize()<<",size = "<<vector1.size()<<endl;
}
void main()
{
myVector<int> myVector1;
myVector<int> myVector2(0,10);
myVector2.push_front(1);
myVector2.erase(11);
printfVector(myVector2);
myVector1.push_back(2);
myVector1.push_front(1);
printfVector(myVector1);
myVector1.insert_after(1,3);
printfVector(myVector1);
myVector2 = myVector1;
myVector2.insert_before(0,0);
myVector2.insert_before(1,-1);
printfVector(myVector2);
}
相关文章推荐
- c++ stl库 vector简单的实现
- [置顶] 从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)
- c++stl库list简单的实现
- C++智能指针,指针容器原理及简单实现(auto_ptr,scoped_ptr,ptr_vector).
- 仿c++的vector简单实现
- c/c++ vector 的简单实现
- C++智能指针,指针容器原理及简单实现(auto_ptr,scoped_ptr,ptr_vector).
- C++自己实现一个简单地Vector
- c++vector简单实现
- 简单数据结构之 vector 栈(C++ vector 实现)
- 1_c++实现简单vector
- [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)
- Vector的简单C++实现
- SLT容器之vector简单实现C++运行时多态
- [置顶] 从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)
- c++ vector 简单实现。
- Vector3的C++简单实现。
- C++ vector 的简单实现
- [置顶] 从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)
- 必须要注意的 C++ 动态内存资源管理(六)——vector的简单实现