C++实现动态顺序表
顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。这样的存储方式使得线性表逻辑上相邻的元素,其在物理存储单元中也是相邻的。只要知道了第一个元素的存储地址,就可以知道线性表中任何一个元素的存储地址。本文利用C++语言,在Windows平台 Visual Studio 2015开发环境下实现。功能:应用C++语言实现顺序表的各项操作。基本的成员函数:构造函数、拷贝构造函数、赋值运算符的重载、析构函数。
// 顺序表构造成功之后,里面存放了n个元素data
Vector(size_t n, const DataType& data = DataType());
Vector(const Vector& v);
Vector& operator=(const Vector& v);
~Vector();
void PushBack(const DataType& data); //尾插
void PopBack(); //尾删
void Print()//打印顺序表
// 给顺序表重新赋值,该函数执行完里面存放了n个元素data
void Assign(size_t n, const DataType& data);
// 在顺序表的pos位置上插入元素data
void Insert(size_t pos, const DataType& data);
// 删除顺序表pos位置上的元素
void Erase(size_t pos);
// 改变顺序表中的元素为n个,如果n>原来顺序表中的元素的个数,多出来的空间用data来填充
void ReSize(size_t n, const DataType& data = DataType());
// 清空顺序表中的元素-->请自己动手验证是否需要清理vector中的空间
void Clear();
// 返回顺序表中有效元素的大小
size_t Size()const;
// 返回顺序表中空间容量的大小
size_t Capacity()const;
// 顺序表是否为空,若为空返回true,否则返回null
bool Empty()const;
// 通过下边访问顺序表index位置上的元素。 思考为什么要成对的来重载
DataType& operator[](size_t index);
const DataType& operator[](size_t index)const;
// 返回顺序表中第一个元素的引用,思考为什么要返回应用,为什么要成对重载
DataType& Front();
const DataType& Front()const;
// 返回顺序表中最后一个的元素的引用,思考为什么要返回引用,为什么要成对重载
DataType& Back();
const DataType& Back()const;
void _CheckCapacity()// 动态扩容
int Find(const DataType & data)//查找数据
#ifndef __VECTOR_H__
#define __VECTOR_H__ #include<iostream>
#include<stdio.h>
#include<assert.h>
using namespace std; #define COW 4
typedef int DataType; class Vector
{
public:
Vector()
: _array(NULL)
, _size()
, _capacity()
{} // 顺序表构造成功之后,里面存放了n个元素data
Vector(size_t n, const DataType& data = DataType())
{
_array = new DataType[n];
_size = n;
_capacity = n;
for(size_t i = ; i<n;i++)
_array[i] = data; }
Vector(const Vector& v)
:_array(new DataType[v._size])
, _size(v._size)
,_capacity(v._capacity)
{
memcpy(_array, v._array, sizeof(DataType)*_size);
}
Vector& operator=(const Vector& v)
{
if (this != &v)
{
DataType *temp = new DataType[v._size];
temp = v._array;
delete[] _array;
_array = temp;
_size = v._size;
_capacity = v._capacity;
memcpy(_array, v._array, sizeof(DataType)*_size);
}
return *this;
}
~Vector()
{
if (_array)
{
delete[] _array;
_array = NULL;
_size = ;
_capacity = ;
}
} public:
void PushBack(const DataType& data)
{
_CheckCapacity();
_array[_size++] = data;
}
void PopBack()
{
assert(!Empty());
--_size;
}
void Print()
{
for (size_t i = ; i < _size; ++i)
{
cout << _array[i] << " ";
}
cout << endl;
}
// 给顺序表重新赋值,该函数执行完里面存放了n个元素data
void Assign(size_t n, const DataType& data)
{
assert(n<_size);
for (size_t i = ; i<n; i++)
_array[i] = data;
} // 在顺序表的pos位置上插入元素data
void Insert(size_t pos, const DataType& data)
{
assert(pos<_size); //需检验pos的合法性
_CheckCapacity();
if (pos == _size - ) //在最后一个位置插入数据等于尾插
{
PushBack(data);
return;
}
else
{
for (size_t i = _size; i > pos; --i)
{
_array[i] = _array[i - ];
}
_array[pos] = data;
_size++;
}
} // 删除顺序表pos位置上的元素
void Erase(size_t pos)
{
assert(pos<_size); //需检验pos的合法性
if (pos == _size - ) //在最后一个位置删除数据等于尾删
{
PopBack();
return;
}
else
{
for (size_t i = pos; i < _size - ; i++)
{
_array[i] = _array[i + ];
}
--_size;
}
} // 改变顺序表中的元素为n个,如果n>原来顺序表中的元素的个数,多出来的空间
// 请用data来填充
void ReSize(size_t n, const DataType& data = DataType())
{
if (n > _size)
{
size_t i = _size;
_size = n;
_CheckCapacity();
for (i; i < n; i++)
_array[i] = data;
}
else
{
size_t i = n;
for(i; i<_size; i++)
PopBack();
}
} // 清空顺序表中的元素-->请自己动手验证是否需要清理vector中的空间
void Clear()
{
delete[] _array;
_array = NULL;
_size = ;
_capacity = ;
}
// 返回顺序表中有效元素的大小
size_t Size()const
{
return _size;
}
// 返回顺序表中空间容量的大小
size_t Capacity()const
{
return _capacity;
}
// 顺序表是否为空,若为空返回true,否则返回null
bool Empty()const
{
return _size == ;
} // 通过下边访问顺序表index位置上的元素
// 思考为什么要成对的来重载
DataType& operator[](size_t index)
{
assert(index);
return _array[index];
}
const DataType& operator[](size_t index)const
{
assert(index);
return _array[index];
}
// 返回顺序表中第一个元素的引用,思考为什么要返回应用,为什么要成对重载
DataType& Front()
{
return _array[];
}
const DataType& Front()const
{
return _array[]; }
// 返回顺序表中最后一个的元素的引用,思考为什么要返回引用,为什么要成对重载
DataType& Back()
{
return _array[_size - ];
}
const DataType& Back()const
{
return _array[_size - ];
}
private:
// 动态扩容-->该函数中有坑,请找出坑在哪?
void _CheckCapacity()
{
// 2*_capacity 有问题?
if (_size >= _capacity)
{
DataType* pTemp = new DataType[_capacity * ];
//memcpy(pTemp, _array, _size*sizeof(DataType));
for (size_t index = ; index < _size; ++index)
pTemp[index] = _array[index];
delete[] _array;
_array = pTemp;
_capacity *= ;
}
}
int Find(const DataType & data)
{
assert(_array != NULL);
for (size_t i = ; i < _size; i++)
{
if (_array[i] == data)
return i;
}
return -;
}
private:
DataType* _array;
size_t _size; // 保存有效元素的个数
size_t _capacity; // 空间的实际大小
}; #endif //__VECTOR_H__
代码当中的问题及思考提示将在下一篇文章中探讨。
C++实现动态顺序表的更多相关文章
- 数据结构C语言版--动态顺序表的基本功能实现(二)
/* * 若各个方法结构体变量参数为: &L(即地址符加变量)则结构体变量访问结构成员变量时使用"." * 若为:*L(即取地址符加变量)则结构体变量访问结构体成员变量使用 ...
- 老郭带你学数据结构(C语言系列)2-线性表之动态顺序表
一.基本概念: 线性表:由n个类型相同的数据元素组成的有限序列,记为(a1,a2,--an). 线性表的特征:其中的元素存在这序偶关系,元素之间存在着严格的次序关系. 顺序存储表:线性表中的元素依次存 ...
- 动态顺序表(C++实现)
顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构. 这样的存储方式使得线性表逻辑上相邻的元素,其在物理存储单元中也是相邻的.只要知道了第一个元素的 ...
- C++模板实现动态顺序表(更深层次的深浅拷贝)与基于顺序表的简单栈的实现
前面介绍的模板有关知识大部分都是用顺序表来举例的,现在我们就专门用模板来实现顺序表,其中的很多操作都和之前没有多大区别,只是有几个比较重要的知识点需要做专门的详解. #pragma once #inc ...
- C简单实现动态顺序表
<span style="font-size:18px;">一下为简单实现:</span> #define SIZE 3; typedef int Data ...
- 数据结构之动态顺序表(C实现)
线性表有2种,分为顺序表和链表. 顺序表: 采用顺序存储方式,在一组地址连续的存储空间上存储数据元素的线性表(长度固定) 链表: 有3种,单链表.双向链表.循环链表(长度不固定) seqList.h ...
- C语言实现的顺序表
顺序表是用一段地址连续的存储单元依次存储数据元素的线性结构.顺序表可分为静态存储和动态存储,静态顺序表比较简单,数据空间固定,而动态顺序表可以动态增容,便于存放大量数据,现主要把动态的基本实现一下~此 ...
- python中的顺序表
Python中的list和tuple两种类型采用了顺序表的实现技术,tuple是不可变类型,即不变的顺序表,因此不支持改变其内部状态的任何操作,而其他方面,则与list的性质类似. list的基本实现 ...
- python基础下的数据结构与算法之顺序表
一.什么是顺序表: 线性表的两种基本的实现模型: 1.将表中元素顺序地存放在一大块连续的存储区里,这样实现的表称为顺序表(或连续表).在这种实现中,元素间的顺序关系由它们的存储顺序自然表示. 2.将表 ...
随机推荐
- FPGA学习体会
我是安徽工程大学电子信息科学与技术专业的学生刘美花,在v3学院的培训结束了,这十几天的培训对我来说还是挺有意义的,不过中间也有一些波折.还记得刚开始的时候和老师还有各个学校的学生不太熟,心中有诸多不满 ...
- hadoop--安装1.2.1版本
hadoop的安装分为三种方式,第一种单机安装,一般用于调试(其实一般都不用).第二种,伪分布式安装,一般程序员开发会使用这种方式.第三种,分布式安装,在实际环境中应用.今天在这里记下的是第二种,即伪 ...
- devexpress设置皮肤、字体以及折叠菜单、伸缩Panel的实现
1.为了体现系统的个性化,越来越多的系统增加了换肤功能.这里例举一个devexpress实现换肤的案例,效果图对比: 第二张图片中更换了皮肤与字体. 2.皮肤数据源绑定代码: //循环添加皮肤名称 f ...
- WC2015 k小割(k短路+暴力+搜索)
首先这道题不是非同一般的恶心,三个数据层次对应三个程序= = PROBLEM:http://uoj.ac/problems解法: 1~2直接暴力枚举边的选择与否+判断就行了 7~14可以发现是一个平面 ...
- 一张图看懂 JS 的事件机制
一.为什么 JavaScript 单线程 假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准? 为了避免复杂性, JS ...
- 基础数据结构-串-KMP算法
KMP算法用于模式串字符匹配,因为没有提前预习,上课时听得云里雾里,后来回去看了一晚上,翻了一些网上的讲解才理解了.我简单讲一下,我们在一串字符串A里搜索匹配另一段字符串B时,思路最简单方法的就是从第 ...
- Hibernate 迫切连接和普通连接的区别
package com.baidu.test; import java.util.ArrayList;import java.util.LinkedHashSet;import java.util.L ...
- Unity3d场景漫游---iTween实现
接触U3D以来,我做过的场景漫游实现方式一般有以下几种: Unity3d中的Animation组件,通过设置摄像机的关键点实现场景漫游 第一人称或第三人称控制器 编写摄像机控制脚本 iTween iT ...
- mfc---获取当前时间
CTime t = CTime::GetCurrentTime(); CString strTime = t.format("%Y/&m%d" %h:%M:%S);
- TypeScript设计模式之策略、模板方法
看看用TypeScript怎样实现常见的设计模式,顺便复习一下. 学模式最重要的不是记UML,而是知道什么模式可以解决什么样的问题,在做项目时碰到问题可以想到用哪个模式可以解决,UML忘了可以查,思想 ...