vector.h:

#ifndef __Vector__H__
#define __Vector__H__
typedef int Rank;
#define DEFAULT_CAPACITY 3 template<typename T> class Vector{
protected:
Rank _size; int _capacity; T*_elem;
void copyFrom(T const *A, Rank lo, Rank hi);
void expand();
void shrink();
void bubbleSort(Rank lo,Rank hi);
bool bubble(Rank lo,Rank hi);
void mergeSort(Rank lo,Rank hi);
void merge(Rank lo,Rank mi,Rank hi);
public:
Vector(int c = DEFAULT_CAPACITY,int s = 0, T v = 0)
{
_elem = new T[_capacity = s];
for (_size = 0; _size < s; _elem[_size++] = v);
}
Vector(T const *A, Rank n) { copyFrom(A, 0, n); }
Vector(T const *A, Rank lo, Rank hi) { copyFrom(A, lo, hi); }
Vector(Vector<T> const &V) { copyFrom(V._elem,0,V._size); }
Vector(Vector<T> const &V, Rank lo, Rank hi) { copyFrom(V._elem, lo, hi);}
~Vector(){delete[]_elem;} Rank size() const { return _size;}
bool empty() const { return !_size;}
Vector<T>& operator=(Vector<T> const&); T&operator[](Rank r) const; void unsort(Rank lo,Rank hi);
Rank find(T const& e,Rank lo,Rank hi) const;
Rank insert(Rank r,T const& e);
int remove(Rank lo,Rank hi);
T remove(Rank r);
int deduplicate();
int disordered() const; int uniquify(); void traverse(void(*)(T&));
template<typename VST> void traverse(VST&); static Rank binSearch(T* A,T const& e,Rank lo,Rank hi);
static Rank binSearch2(T* A, T const& e, Rank lo, Rank hi);
static Rank binSearch3(T* A, T const& e, Rank lo, Rank hi);
};
#endif

vector.cpp:

#include"Vector.h"
template<typename T>
void Vector<T>::copyFrom(T const * A, Rank lo, Rank hi)
{
_elem = new T[_capacity=2*(hi-lo)];
_size = 0;
while (lo < hi)
{
_elem[_size++] = A[lo++];
}
} template<typename T>
void Vector<T>::expand()
{
if (_size < _capacity)return;
if (_capacity < DEFAULT_CAPACITY) { _capacity = DEFAULT_CAPACITY; }
T*oldElem = _elem;
_elem = new T[_capacity<<=1];
for (int i = 0; i < _size; i++)
{
_elem[i] = oldElem[i];
}
delete[]oldElem;
} template<typename T>
void Vector<T>::shrink()
{
if (_capacity < DEFAULT_CAPACITY << 1)return;
if (_size << 2 > _capacity)return;
T *oldElem = _elem;
_elem = new T[_capacity>>=1];
for(int i = 0; i < _size; i++)
{
_elem[i] = oldElem[i];
}
delete[]oldElem;
} template<typename T>
void Vector<T>::bubbleSort(Rank lo, Rank hi)
{
while (!bubble(lo,hi--));
} template<typename T>
bool Vector<T>::bubble(Rank lo, Rank hi)
{
bool sorted = true;
while (++lo < hi)
{
if(_elem[lo - 1] < _elem[lo])
{
sorted = false;
swap(_elem[lo-1],_elem[lo]);
}
}
return sorted;
} template<typename T>
void Vector<T>::mergeSort(Rank lo, Rank hi)
{
if (hi - lo < 2) return;
int mi = (lo + hi) / 2;
mergeSort(lo,mi);
mergeSort(mi,hi);
merge(lo,mi,hi);
} template<typename T>
void Vector<T>::merge(Rank lo, Rank mi,Rank hi)
{
T *A = _elem + lo;
int lb = mi - lo;
T* B = new T[lb];
for (int i = 0; i < lb; i++) B[i] = A[i];
int rb = hi - mi;
T *C = _elem + mi;
for (Rank i=0,int j = 0, int k = 0; (j < lb) || (k < rb);)
{
if ((j<lb)&&(k>rb||(B[j] < C[k])))
{
A[i++] = B[j++];
}
if ((k<rb)&&(j>lb||(C[k]<=B[j])))

A[i++] = C[k++];

}
delete[] B; } template<typename T>
Vector<T>& Vector<T>::operator=(Vector<T> const & V)
{
if (_elem) delete[]_elem;
copyFrom(V._elem,0,V._size);
return *this;
} template<typename T>
T & Vector<T>::operator[](Rank r) const
{
return _elem[r];
} template<typename T>
void Vector<T>::unsort(Rank lo, Rank hi)
{
T* V = _elem + lo;
for(Rank i = hi - lo; i >= 0; i--)
{
swap(V[i-1] = V[rand()%i]);
}
} template<typename T>
Rank Vector<T>::find(T const & e, Rank lo, Rank hi) const
{
while((lo < hi--)&&(e!=_elem[hi]));
return hi;
} template<typename T>
Rank Vector<T>::insert(Rank r, T const & e)
{
expand();
for (int i = _size; i > r; i--)
{
_elem[i] = _elem[i-1];
}
_elem[r] = e;
_size++;
return r;
} template<typename T>
int Vector<T>::remove(Rank lo, Rank hi)
{
if (lo == hi)return 0;
while (hi < _size)
{
_elem[lo++] = _elem[hi++];
}
_size = lo;
shrink();
return hi - lo;
} template<typename T>
T Vector<T>::remove(Rank r)
{
T e = _elem[r];
remove(r,r+1);
return e;
} template<typename T>
int Vector<T>::deduplicate()
{
int oldsize = _size;
Rank i = 1;
while (i < _size)
{
(find(_elem[i], 0, _size) < 0) ? i++ : remove(i);
} return oldsize-_size; } template<typename T>
int Vector<T>::disordered() const
{
int n = 0;
for (int i = 1; i < _size; i++)
{
if(_elem[i - 1] > _elem[i])
{
n++;
}
}
return n;
} template<typename T>
int Vector<T>::uniquify()
{
Rank i = 0, j = 0;
while (++j < _size)
{
if (_elem[i] != _elem[j])
{
_elem[++i] = _elem[j];
}
}
_size = ++i;
shrink();
return j - i;
} template<typename T>
Rank Vector<T>::binSearch(T * A, T const & e, Rank lo, Rank hi)
{
while (lo < hi)
{
Rank mi = (lo + hi) >> 1;
if (e > A[mi])
{
lo = mi+1;
}
else if (e < A[mi])
{
hi = mi;
}
else {
return mi;
}
}
return -1;
} template<typename T>
Rank Vector<T>::binSearch2(T * A, T const & e, Rank lo, Rank hi)
{
while (1 < (hi - lo))
{
Rank mi = (lo + hi) >> 1;
(e < A[mi]) ? hi = mi : lo = mi;
}
return (e == A[lo]) ? lo : -1;
} template<typename T>
Rank Vector<T>::binSearch3(T * A, T const & e, Rank lo, Rank hi)
{
while (lo < hi)
{
Rank mi = (lo + hi) >> 1;
(e < A[mi]) ? hi = mi : lo = mi + 1;
}
return --lo;
} template<typename T>
void Vector<T>::traverse(void(*visit)(T &))
{
for (int i = 0; i < _size; i++)
{
visit(_elem[i]);
}
} template<typename T>
template<typename VST>
void Vector<T>::traverse(VST &visit)
{
for (int i = 0; i < _size; i++)
{
visit(_elem[i]);
}
}

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. 五、Uniapp+vue+腾讯IM+腾讯音视频开发仿微信的IM聊天APP,支持各类消息收发,音视频通话,附vue实现源码(已开源)-聊天输入框的实现

    会话好友列表的实现 1.项目引言 2.腾讯云后台配置TXIM 3.配置项目并实现IM登录 4.会话好友列表的实现 5.聊天输入框的实现 6.聊天界面容器的实现 7.聊天消息项的实现 8.聊天输入框扩展 ...

  2. JAVA调用阿里云短信接口

    官方文档:https://help.aliyun.com/document_detail/101414.html?spm=a2c4g.11186623.6.626.2cef6220yxh5l7 jar ...

  3. IDEA安装vue.js插件后,new没有Vue component

    首先要安装vue相关的插件vue.js 但是很多人安装vue.js右键发现没有vue Componment,解决方法如下 Settings>Editor>File and Code Tem ...

  4. springboot目录结构、重要配置文件、重要注解的详解

    前面2篇博客已经带着大家搭建了springboot项目,并编写了持久化接口部署到tomcat下访问.这里我们一起补充下springboot的基本信息 一.springboot简单介绍 springbo ...

  5. 【LeetCode】989. Add to Array-Form of Integer 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数组转整数再转数组 模拟加法 日期 题目地址:htt ...

  6. 1421 最大MOD值

    1421 最大MOD值 基准时间限制:1 秒 空间限制:131072 KB  有一个a数组,里面有n个整数.现在要从中找到两个数字(可以是同一个) ai,aj ,使得 ai mod aj 最大并且 a ...

  7. 分布式系统(二)——GFS

    分布式存储系统的难点 在存储系统中,为了获得巨大的性能加成,一个很自然的想法就是采用分片(sharding),将数据分割存储到多台服务器上,这样获得了更大的存储容量,而且可以并行地从多台服务器读取数据 ...

  8. Linux 进程调度

    线程状态(context) 程序计数器(Program Counter),它表示当前线程执行指令的位置. 保存变量的寄存器. 程序的Stack.通常来说每个线程都有属于自己的Stack,Stack记录 ...

  9. 初识python:多线程

    多线程:在一个程序中,独立运行的程序片断叫作"线程"(Thread),利用它编程的概念就叫作"多线程处理".即:一个进程中,多个线程. 举个例说明:就像是一列火 ...

  10. mybatis-plus中查询出的字段为空

    数据查询出后其中几个字段为null 解决方法: 数据库的字段命名方式为使用下划线连接,对应的实体类应该是驼峰命名方式,而我使用的是和数据库同样的命名方式. 所以mybatis-plus映射不到,修改实 ...