自己实现的vector
#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的更多相关文章
- c++ vector 使用
1. 包含一个头文件: 1 #include <vector> 2. 申明及初始化: std::vector<int> first; // empty vector of in ...
- Vector Tile
Mapbox Vector Tile Specification A specification for encoding tiled vector data. <?XML:NAMESPACE ...
- ArrayList、Vector、LinkedList的区别联系?
1.ArrayList.Vector.LinkedList类都是java.util包中,均为可伸缩数组. 2.ArrayList和Vector底层都是数组实现的,所以,索引数据快,删除.插入数据慢. ...
- ArrayList、Vector、HashMap、HashSet的默认初始容量、加载因子、扩容增量
当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上,这无疑使效率大大降低. 加载因 ...
- Java中Vector和ArrayList的区别
首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList.Vector和LinkedList.List用于存放多个元素,能够维护元素的次序,并且允许元素的重复.3个具体 ...
- C++使用vector
#include <iostream> #include <string> #include <vector> using namespace std; void ...
- [LeetCode] Flatten 2D Vector 压平二维向量
Implement an iterator to flatten a 2d vector. For example,Given 2d vector = [ [1,2], [3], [4,5,6] ] ...
- C++ 数组array与vector的比较
转:http://blog.csdn.net/yukin_xue/article/details/7391897 1. array 定义的时候必须定义数组的元素个数;而vector 不需要: 且只能包 ...
- vector定义初始化
头文件 #include<vector> using std::vector; vector<T> v1; vector<T> v2(v1); vector< ...
- vector迭代器用法
#include<iostream> #include<vector> using namespace std; int main() { vector<int> ...
随机推荐
- android中使用百度定位sdk实时的计算移动距离
; //5秒刷新一次 private Handler refreshHandler = new Handler(){ //刷新界面的Handler public void handleMessag ...
- jquery插件获取事件类型
//需要在使用函数时传入event关键字 $('[name=lprice]').change(function(event){ $('[name=lprice]').validate({ event: ...
- hdu1081 最大子矩阵
最大子矩阵自然直在最大连续子序列的升级版 只是其原理都是用到了动态规划思想 仅仅是矩阵用到了枚举 +合并 把非常多列看成是一列的和 #include<stdio.h> ...
- win7查看端口占用
1.查看谁占用了我们的80端口,在windows命令行窗口下执行: netstat -aon|findstr 80 发现80端口被进程号为2596的进程占用.2.查看占用80端口进程的应用程序是什 ...
- OpenCV 中的三大数据类型:CvMat 类型
前言 本文将介绍 OpenCV 中的矩阵结构 CvMat 并提供几个很常用的矩阵使用方法. 更多的矩阵处理函数还请参阅相关资料. CvMat 的类型定义 typedef struct CvMat { ...
- 实模式切换到保护模式,为什么要开启A20地址线(系统升级产生的兼容性问题)
[-1]写在前面: 以下部分内容总结于 http://blog.csdn.net/ruyanhai/article/details/7181842 complementary: 兼容性是指运行在前期C ...
- Android OkHttp的Cookie自己主动化管理
Android中在使用OkHttp这个库的时候.有时候须要持久化Cookie,那么怎么实现呢.OkHttp的内部源代码过于复杂,不进行深究.这里仅仅看当中的HttpEngineer里面的部分源代码,在 ...
- zoj 2068 - Chopsticks
题目:非常多人在一起吃饭.有两组单支的筷子,定义badness为一对筷子长度差的平方,求最小的badness和. 分析:dp,最大公共子序列类似物. 这里利用数学关系找到一个结论: a < b ...
- smarty模板里实现缓存。
smarty模板里实现缓存.分页缓存在任何里都可以用 我用了三个类 include("../init.inc.php");//模板入口类 include("../DBDA ...
- P3382 【模板】三分法
题目描述 如题,给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减.试求出x的值. 输入输出格式 输入格式: 第一行一次包含一个正整数N和两个实数l.r,含 ...