#include <iostream>
#include <memory>
using std::cout;
using std::endl;
using std::allocator; template <typename T>
class Vector
{
public:
typedef T* iterator;
typedef const T * const_iterator; Vector()
: _start(0)
, _finish(0)
, _end_of_storage(0)
{} ~Vector(); iterator begin(){ return _start; }
iterator end(){ return _finish; } void push_back(const T & t);
void pop_back(); size_t size() const
{ return _finish - _start; } size_t capacity() const
{ return _end_of_storage - _start; }
private:
void reallocate(); private:
static allocator<T> _alloc; T * _start;
T * _finish;
T * _end_of_storage;
}; template <typename T>
allocator<T> Vector<T>::_alloc; template <typename T>
Vector<T>::~Vector()
{
//销毁对象
while(_start != _finish)
_alloc.destroy(--_finish);
//回收开辟的空间
if(_start)
_alloc.deallocate(_start, capacity());
} //动态数组的实现:
// 当当前元素的个数与能容纳元素的个数相等时,
//先开辟新的空间(原来的2倍),然后把原来空间的元素
//复制到新空间上,再回收原来的空间,最后在新开的空间上添加
//新的元素 template <typename T>
void Vector<T>::push_back(const T & t)
{
if(size() == capacity())
{
//动态扩容
reallocate();
} //构造对象
_alloc.construct(_finish++, t);
} template <typename T>
void Vector<T>::pop_back()
{
if(_start != _finish)
_alloc.destroy(--_finish);
} template <typename T>
void Vector<T>::reallocate()
{
size_t oldCapacity = capacity();
size_t newCapacity = oldCapacity ? 2 * oldCapacity : 1; T * tmp = _alloc.allocate(newCapacity);//申请是原始的内存
if(_start)
{
///memcpy();// 内置类型的数据
//copy();//调用对象的赋值运算符函数,意味着对象存在
std::uninitialized_copy(_start, _finish, tmp);//复制原来空间的数据 //回收原来空间的数据
while(_start != _finish)
_alloc.destroy(--_finish);
//回收原来空间
_alloc.deallocate(_start, oldCapacity);
}
_start = tmp;
_finish = _start + oldCapacity;
_end_of_storage = _start + newCapacity;
} class Point
{
public:
Point(int ix = 0, int iy = 0)
: _ix(ix)
, _iy(iy)
{ cout << "Point(int=0,int=0)" << endl;} Point(const Point & rhs)
: _ix(rhs._ix)
, _iy(rhs._iy)
{
cout << "Point(const Point &)" << endl;
} ~Point()
{ cout << "~Point()" << endl; } friend std::ostream & operator<<(std::ostream & os, const Point & rhs);
private:
int _ix;
int _iy;
}; std::ostream & operator<<(std::ostream & os, const Point & rhs)
{
os << "(" << rhs._ix
<< "," << rhs._iy
<< ")";
return os;
} template <typename Container>
void display(Container & c)
{
cout << "c's size = " << c.size() << endl
<< "c's capacity = " << c.capacity() << endl << endl;
#if 0
#endif
} int main(void)
{
Vector<Point> points;
display(points);
points.push_back(Point(1, 2));
display(points); points.push_back(Point(3, 4));
display(points);
points.push_back(Point(5, 6));
display(points);
#if 0
points.push_back(Point(1, 2));
display(points);
points.push_back(Point(1, 2));
display(points);
points.push_back(Point(1, 2));
display(points);
#endif Vector<Point>::iterator it = points.begin();
while(it != points.end())
{
cout << *it << endl;
++it;
}
cout << endl;
return 0;
}

  

自己实现的vector的更多相关文章

  1. c++ vector 使用

    1. 包含一个头文件: 1 #include <vector> 2. 申明及初始化: std::vector<int> first; // empty vector of in ...

  2. Vector Tile

    Mapbox Vector Tile Specification A specification for encoding tiled vector data. <?XML:NAMESPACE ...

  3. ArrayList、Vector、LinkedList的区别联系?

    1.ArrayList.Vector.LinkedList类都是java.util包中,均为可伸缩数组. 2.ArrayList和Vector底层都是数组实现的,所以,索引数据快,删除.插入数据慢. ...

  4. ArrayList、Vector、HashMap、HashSet的默认初始容量、加载因子、扩容增量

    当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上,这无疑使效率大大降低. 加载因 ...

  5. Java中Vector和ArrayList的区别

    首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList.Vector和LinkedList.List用于存放多个元素,能够维护元素的次序,并且允许元素的重复.3个具体 ...

  6. C++使用vector

    #include <iostream> #include <string> #include <vector> using namespace std; void ...

  7. [LeetCode] Flatten 2D Vector 压平二维向量

    Implement an iterator to flatten a 2d vector. For example,Given 2d vector = [ [1,2], [3], [4,5,6] ] ...

  8. C++ 数组array与vector的比较

    转:http://blog.csdn.net/yukin_xue/article/details/7391897 1. array 定义的时候必须定义数组的元素个数;而vector 不需要: 且只能包 ...

  9. vector定义初始化

    头文件 #include<vector> using std::vector; vector<T> v1; vector<T> v2(v1); vector< ...

  10. vector迭代器用法

    #include<iostream> #include<vector> using namespace std; int main() { vector<int> ...

随机推荐

  1. FZU 2124 FOJ 2124 吃豆人【BFS】

     Problem 2124 吃豆人 Accept: 134    Submit: 575 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Probl ...

  2. 华为p20:拍美景,听讲解,旅行更智能

    华为P20轰轰烈烈地上市了,本来对手机并不感冒的我,看到身边的好友换了P20,不禁感慨:这个月的活又要白干了,全部都要上交给华为,因为这款手机完全戳中了旅游爱好者的痛点. 痛点一:丢弃笨重的单反,手机 ...

  3. Eclipse工程前面有个红色的感叹号的解决办法

    今天从SVN下载下工程之后,编译完,发现有两个工程有个红色的感叹号,一直没找到什么原因,问百度老师,发现问题的解决办法了. 1.先在控制台上点击Problems 如果控制台没有Problems,点击工 ...

  4. Fragment 懒加载

    我们在遇到Activity嵌套Fragment的时候经常会遇到多个Fragment页面同时加载数据,一开始的时候就初始化很多页面,有的甚至进入页面的时候,会造成缓慢的现象,下面我们就针对这个问题做一下 ...

  5. Kubernetes TensorFlow 默认 特定 集群管理器

    Our goal is to foster an ecosystem of components and tools that relieve the burden of running applic ...

  6. Swift 学习笔记 (函数)

    函数 函数是一个独立的代码块,用来执行特定的任务.Swift中的函数与Object-C中的函数一样,但是声明与书写的方式不太一样,现在我们就通过几个例子介绍一下Swift中的函数.简单的来说,他与JS ...

  7. Hadoop实战-Flume之自定义Sink(十九)

    import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import j ...

  8. 【题解】P4799[CEOI2015 Day2]世界冰球锦标赛

    [题解][P4799 CEOI2015 Day2]世界冰球锦标赛 发现买票顺序和答案无关,又发现\(n\le40\),又发现从后面往前面买可以通过\(M\)来和从前面往后面买的方案进行联系.可以知道是 ...

  9. centos设置固定IP方法

    首先网络模式设为桥接 [root@centos64 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0HWADDR=00:0C:2 ...

  10. ALV TREE 实例

    ALV TREE 实例 REPORT ZRPT_PS_PS021TREE . TABLES: PROJ, "项目定义数据 PRPS, "WBS元素数据 ZCJ30, "A ...