Vector模板类

 1 #include "stdafx.h"
 2 typedef int Rank; //秩
 3  #define DEFAULT_CAPACITY  3 //默认的初始容量(实际应用中可设置为更大)
 4
 5  template <typename T> class Vector
 6  { //向量模板类
 7      protected:
 8            Rank _size; int _capacity;  T* _elem; //规模、容量、数据区
 9             void copyFrom(T const* A, Rank lo, Rank hi); //复制数组区间A[lo, hi)
10             void expand(); //空间不足时扩容
11             void shrink(); //装填因子过小时压缩
12             bool bubble(Rank lo, Rank hi); //扫描交换
13             void bubbleSort(Rank lo, Rank hi); //起泡排序算法
14             Rank max(Rank lo, Rank hi); //选取最大元素
15             void selectionSort(Rank lo, Rank hi); //选择排序算法
16             void merge(Rank lo, Rank mi, Rank hi); //归并算法
17             void mergeSort(Rank lo, Rank hi); //归并排序算法
18             Rank partition(Rank lo, Rank hi); //轴点构造算法
19             void quickSort(Rank lo, Rank hi); //快速排序算法
20              void heapSort(Rank lo, Rank hi); //堆排序(稍后结合完全堆讲解)
21          public:
22              // 构造函数
23                 Vector(int c = DEFAULT_CAPACITY, int s = 0, T v = 0) //容量为c、规模为s、所有元素初始为v
24                 { _elem = new T[_capacity = c]; for (_size = 0; _size < s; _elem[_size++] = v); } //s<=c
25                 Vector(T const* A, Rank n) { copyFrom(A, 0, n); } //数组整体复制
26                 Vector(T const* A, Rank lo, Rank hi) { copyFrom(A, lo, hi); } //区间
27                 Vector(Vector<T> const& V) { copyFrom(V._elem, 0, V._size); } //向量整体复制
28                 Vector(Vector<T> const& V, Rank lo, Rank hi) { copyFrom(V._elem, lo, hi); } //区间
29              // 析构函数
30                     ~Vector() { delete[] _elem; } //释放内部空间
31              // 只读访问接口
32                 Rank size() const { return _size; } //规模
33                 bool empty() const { return !_size; } //判空
34                 int disordered() const; //判断向量是否已排序
35                 Rank find(T const& e) const { return find(e, 0, _size); } //无序向量整体查找
36                 Rank find(T const& e, Rank lo, Rank hi) const; //无序向量区间查找
37                 Rank search(T const& e) const //有序向量整体查找
38                     { return (0 >= _size) ? -1 : search(e, 0, _size); }
39                 Rank search(T const& e, Rank lo, Rank hi) const; //有序向量区间查找
40              // 可写访问接口
41                     T& operator[] (Rank r) const; //重载下标操作符,可以类似于数组形式引用各元素
42                 Vector<T> & operator= (Vector<T> const&); //重载赋值操作符,以便直接克隆向量
43                 T remove(Rank r); //删除秩为r的元素
44                 int remove(Rank lo, Rank hi); //删除秩在区间[lo, hi)之内的元素
45                 Rank insert(Rank r, T const& e); //插入元素
46                 Rank insert(T const& e) { return insert(_size, e); } //默认作为末元素插入
47                 void sort(Rank lo, Rank hi); //对[lo, hi)排序
48                 void sort() { sort(0, _size); } //整体排序
49                 void unsort(Rank lo, Rank hi); //对[lo, hi)置乱
50                 void unsort() { unsort(0, _size); } //整体置乱
51                 int deduplicate(); //无序去重
52                 int uniquify(); //有序去重
53              // 遍历
54                 void traverse(void(*) (T&)); //遍历(使用函数指针,只读或局部性修改)
55                 template <typename VST> void traverse(VST&); //遍历(使用函数对象,可全局性修改)
56
57 }; //Vector
时间: 2024-10-29 19:10:17

Vector模板类的相关文章

Vector模板类的建立与实现(一)

最近学习了数据结构,对线性表有了比较深刻的认识,并和c++中容器的实现对照了下,有了点小收获,记录下来.. 1,首先线性表有2种存储结构:顺序存储结构,链式存储结构.(先讲顺序存储,之后看链表list的时候再说)顺序存储就相当于数组,连续的存储地址,插入和删除要移动大量的数据元素,因为地址是连续的,但是随机访问能力好,也就是下标访问元素的能力. 2.对c++中vector类模板的实现,改变了数组固定大小的缺点,可以动态添加或删除元素改变容器的大小,有很多的函数成员,使用起来也很方便. 其实vec

模板类 vector

概要 介绍一下模板类 vector 的常用操作,以及一个应用举例,顺时针打印矩阵. ? 基本定义 模板类 vector 是一种动态数组,它是使用 new 创建动态数组的替代品,实际上,vector 也是使用 new 和 delete 来管理内存,但这种工作是自动完成的. 要使用 vector 对象,必须包含头文件 vector,另外 vector 包含在名称空间 std 中,如下 : #include<vector> using namespace std; // 或 using std::v

一个数组类【模板类】

这学期的大作业感觉挺简单的,就是写一个模板类MyList,实现一些Python中的list的操作(类似于c++中的vector,但是不支持迭代器).这些功能都很简单,唯一麻烦的就是模板类特别烦,特别是友元函数,首先要声明这个类,然后声明是函数的声明,然后是类中友元函数的声明,最后是实现.友元函数的声明还有一个问题就是声明时在函数名后面要加上一个<>就像这样: friend void Qsort<>(T a[],int low,int high,bool less); 还有一个要注意

模板类的定义和实现可以不在同一个文件中

写c++程序时我们经常会把函数的定义写在xxx.h中,把函数的实现写在xxx.cpp, 但是当我们写带模版的函数和类时,这样写 就会出现问题,如下: stack.h //stack.h #ifndef STACK_HPP #define STACK_HPP #include <vector> #include <stdexcept> template<typename T, typename TContainer = std::vector<T>> clas

模板类使用示例(一)

以下是一个Stack的模板实现类,注意GCC不支持将模板类的声明和定义分开放(普通类支持): TestCC.h文件的内容: #ifndef TESTCC_H #define TESTCC_H #include <iostream> #include <vector> #include <stdexcept> template <typename T> class Stack { private: std::vector<T> elems; pub

基于ACE的定时器模板类

1 ACETimerClockGenerator.h 2 ClockGeneratorIF.h 3 在类中定义一个结构体,在结构体中定义一个函数. 4 在结构体中定义一个函数,这样做有什么好呢? 5 6 TimerHandler.h 7 用了模板的方法去构造定时器类.有助于底层调用上层.在构造的时候就初始化一个类中最大的定时器个数,及模板类(也就是parent). 8 TimerHandler(T *parent, int numTimers) : timers(numTimers, -1) 9

模板类与运算符重载

我自定义了一个模板类并重载了运算符,预定义实现功能为能实现对数组一般操作,类似于vector. #ifndef ARRAY_H #define ARRAY_H #include <iostream> using namespace std; template<class T> class Array{ friend ostream& operator<<(ostream&, const Array &); friend istream&

STL模板类--数据结构与算法

STL提供了一些模板类,实现了<数据结构>中的一些数据结构类型 在写代码时用到栈,队列等数据结构时可以充分利用STL模板类,会发现特别好用. 想起C语言中用数组实现栈和队列,简直就是噩梦. C++是世界上最好的语言...(just kidding !!!) 顺序容器:动态数组vector;deque链表list; 关联容器:set/multiset有序值:map/multimap有序键值对 一. 动态数组vector类 1.定义:#include<vector>  std::vec

模板类与类模板、函数模板与模板函数等的区别

在C++中有好几个这样的术语,但是我们很多时候用的并不正确,几乎是互相替换混淆使用.下面我想彻底辨清几个术语,这样就可以避免很多概念上的混淆和使用上的错误.这几个词是: 函数指针——指针函数 数组指针——指针数组 类模板——模板类 函数模板——模板函数 最终在使用中,我们就可以让它们实至名归,名正言顺. 1.函数指针——指针函数   函数指针的重点是指针.表示的是一个指针,它指向的是一个函数,例子: int   (*pf)(); 指针函数的重点是函数.表示的是一个函数,它的返回值是指针.例子: