java vector迭代器_vector容器、迭代器和空间配置器三个类方法的实现

C++的STL库有一个容器叫vector,这个容器底层的数据结构是一个内存可以自动增长的数组,每次当数组存储满了以后,内存可以自动增加两倍,请完成vector容器、迭代器和空间配置器三个类方法的实现。

#include

using namespace std;

//容器默认的空间配置器的实现

template

class myallocator

{

public:

T* allocate(size_t size) //开辟内存

{

return (T*)malloc(size);

}

void deallocate(void *ptr) //释放内存

{

free(ptr);

}

void construct(T *ptr, const T &val)//构造对象

{

new(ptr)T(val);

}

void destroy(T *ptr) //析构对象

{

ptr->~T();

}

};

//容器的类模板

template>

class Vector

{

public:

//迭代器类型前置声明

class iterator;

//默认构造函数

Vector(int size = 5)

{

_first = _allocator.allocate(size*sizeof(E));

_end = _first + size;

_last = _first;

}

//析构函数

~Vector()

{

int size = _last - _first;

for (int i = 0; i < size; ++i)

{

_allocator.destroy(_first + i);

}

_allocator.deallocate(_first);

_first = _last = _end = NULL;

}

//拷贝构造函数

Vector(const Vector &src)

{

int length = src._end - src._first;

_first = _allocator.allocate(length*sizeof(E));

int size = src._last - src._first;

for (int i = 0; i < size; ++i)

{

_allocator.construct(_first + i, src._first[i]);

}

_end = _first + size;

_last = _first + length;

}

//赋值运算符的重载函数

Vector& operator=(const Vector &src)

{

if (this == &src)

{

return*this;

}

int size = _last - _first;

for (int i = 0; i < size; ++i)

{

_allocator.destroy(_first + i);

}

_allocator.deallocate(_first);

_first = _last = _end = NULL;

int length = src._end - src._first;

_first = _allocator.allocate(length*sizeof(E));

int size = src._last - src._first;

for (int i = 0; i < size; ++i)

{

_allocator.construct(_first + i, src._first[i]);

}

_end = _first + size;

_last = _first + length;

}

//向容器的末尾添加新元素value,若增长内存,调用resize函数

void push_back(const E &value)

{

if (full())

{

resize();

}

_allocator.construct(_last, value);

_last++;

}

//删除容器末尾的元素

void pop_back()

{

if (empty())

{

return;

}

_last--;

_allocator.destroy(_last);

}

//向指定位置插入新元素value,若增长内存,调用resize函数

iterator insert(iterator it, const E &value)

{

if (it.mptr<_first it.mptr>_last)

{

return _last;

}

if (_last == _end)

{

int offset = it.mptr - _first;

resize();

it.mptr = _first + offset;

}

E*p = _last;

for (; p > it.mptr; --p)

{

_allocator.construct(p, *(p - 1));

_allocator.destroy(p - 1);

}

_allocator.construct(p, value);

_last++;

return p;

}

//删除指定位置的元素

iterator erase(iterator it)

{

if (it.mptr<_first it.mptr>= _last)

{

return _last;

}

E*p = it.mptr;

for (; p < _last - 1; ++p)

{

_allocator.destroy(p);

_allocator.construct(p, *(p + 1));

}

_allocator.destroy(p);

--_last;

return it.mptr;

}

//判断容器是否空

bool empty()const{ return _first == _last; }

//判断容器是否满

bool full()const{ return _last == _end; }

//容器的迭代器实现

class iterator

{

public:

iterator(E*ptr = NULL) :mptr(ptr){}

bool operator!=(const iterator&it)

{

return mptr != it.mptr;

}

void operator++()

{

mptr++;

}

E&operator*()

{

return*mptr;

}

E*mptr;

};

iterator begin(){ return iterator(_first); }

iterator end(){ return iterator(_last); }

private:

//内存增长函数,按原有容量的两倍增长

void resize()

{

int size = _last - _first;

E*ptmp = _allocator.allocate((size)*sizeof(E)* 2);

for (int i = 0; i < size; ++i)

{

_allocator.construct(ptmp + i, _first[i]);

}

for (int i = 0; i < size; ++i)

{

_allocator.destroy(_first + i);

}

_allocator.deallocate(_first);

_first = ptmp;

_end = _first + size * 2;

_last = _first + size;

}

E *_first; //指向数组的起始位置

E *_end; //指向数组的末尾的后继位置

E *_last; //指向数组最后一个有效数据的后继位置

allocator _allocator; // vector容器的空间配置器

};

int main()

{

VectorVec;

Vec.push_back(20);

Vec.push_back(21);

Vec.push_back(22);

Vec.push_back(23);

Vec.push_back(24);

Vec.push_back(25);

Vec.push_back(26);

Vec.pop_back();

Vec.erase(Vec.begin());

Vec.insert(Vec.begin(),66);

Vector::iterator it = Vec.begin();

for (; it != Vec.end(); ++it)

{

cout << *it << " ";

}

cout << endl;

return 0;

}

运行结果如下:

17a4f817934b5718a1bc9210c00d43e8.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值