参考书籍:《数据结构(C++语言版)》邓俊辉著
向量(vector)是最基本的线性数据结构——序列(sequence)中的一种。向量中。所有数据项的物理存放位置与其逻辑次序一致,其逻辑次序被称作秩(rank)。
C++中已经有实现向量的库<vector>,我们不使用该库,而是仿照它实现一种基于向量的抽象数据类型(Abstract Data Type,ADT)。
ADT接口
下面列出需要实现的接口:
| 操作接口 | 功能 | 适用对象 |
|---|---|---|
| size ( ) | 返回向量规模 | 向量 |
| get ( r ) | 获取秩为r的元素 | 向量 |
| put ( r, e ) | 用e替换秩为r的元素 | 向量 |
| insert ( r, e ) | 在秩为r的位置插入元素e | 向量 |
| remove ( r ) | 删除秩为r的对象并返回 | 向量 |
| disordered ( ) | 判断是否逆序,返回逆序数 | 向量 |
| sort ( ) | 非降序重新排列 | 向量 |
| find ( e ) | 查找目标元素,返回最大的秩 | 向量 |
| search ( e ) | 查找目标元素,返回最大的秩 | 有序向量 |
| deduplicate ( ) | 删除重复元素 | 向量 |
| uniquify ( ) | 删除重复元素 | 有序向量 |
| traverse ( ) | 遍历向量并统一处理 | 向量 |
Vector模板类
下面定义Vector模板类:
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); //从A中复制区间[lo, hi)
void expand(); //空间不足时扩容
void shrink(); //装填因子过小时压缩空间
bool bubble(Rank lo, Rank hi); //冒泡排序的基本操作,扫描交换
public:
//构造函数
Vector(int c = DEFAULT_CAPACITY, int s = 0, T v = 0)
{
_elem = new T[_capacity = c];
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; } //判空
int disordered() const; //返回逆序数
Rank find(T const &e) const {
return find(e, 0, _size); } //无序向量整体查找
Rank find(T const

本文档详细介绍了如何实现一个基于向量的抽象数据类型(ADT),包括其构造函数、只读和可写接口、运算符重载、动态空间管理、排序、查找、删除和去重等操作。向量类使用模板实现,支持不同类型的元素,并通过数组进行存储。此外,还讨论了冒泡排序、二分查找等算法在向量操作中的应用。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



