c++实现的Array数据结构
1.Array.h,Array<T>的定义
template <class T>
class Array
{
protected:
T *data; //一个指向数组数据的指针
unsigned int base; //base为数组的起始下表
unsigned int length; //length为数组的长度
public:
Array(); //缺省的构造函数
Array(unsigned int, unsigned int = ); //数组构造函数
~Array(); //析构函数 Array(Array const&); //拷贝构造函数
Array& operator = (Array const&); //重载等号操作符,用于一个数组给另外一个数组赋值 T const& operator [] (unsigned int) const; //重载中括号操作符,返回一个T数值常量,返回值不能被改变,在函数末尾加const表示this指针指向const
T& operator [] (unsigned int); //重载中括号操作符,返回一个T数值常量,其返回值可以被改变 T* Data() const; //返回数组数据的指针data
unsigned int Base() const; //返回成员base
unsigned int Length() const; //返回成员length void SetBase(unsigned int); //设置成员变量base的数值
void SetLength(unsigned int); //设置成员变量length的数值
}; //动态数组所占空间S(n)=sizeof(T*)+2sizeof(unsigned int)+nsizeof(T),假定T类型所占用空间为一个常数,故S(n)=O(n)
2.Array<T>中成员函数的实现
#include "Array.h" template <class T>
Array<T>::Array() :
data(new T[]),
base(),
length()
{}
//缺省的构造函数不含变量,只需要给对象的变量一个初始值,时间复杂度O(1) template <class T>
Array<T>::Array(unsigned int n, unsigned int m) :
data(new T[n]),
base(m),
length(n)
{}
//初始化数组,n为数组的长度,时间复杂度常量O(1) template <class T>
Array<T>::Array(Array<T> const& array) :
data(new T[array.length]),
base(array.base),
length(array.length)
{
for (unsigned int i = ; i < length; ++i)
data[i] = array.data[i];
} //备份构造函数,将一个数组从赋值到另外一个数组,时间复杂度为O(n) template <class T>
Array<T>::~Array()
{
delete[] data;
} //析构函数,删除数组所占用的内存空间 template <class T>
T* Array<T>::Data() const
{
return data;
} template <class T>
unsigned int Array<T>::Base() const
{
return base;
} template <class T>
unsigned int Array<T>::Length() const
{
return length;
} //这三个为存取器函数,用来返回成员,时间复杂度都为O(1) template <class T>
T const& Array<T>::operator[] (unsigned int position) const
{
unsigned int const offset = position - base;
if (offset >= length)
throw out_of_range("invalid position");
return data[offset];
} template <class T>
T& Array<T>::operator[] (unsigned int position)
{
unsigned int const offset = position - base;
if (offset >= length)
throw out_of_range("invalid position");
return data[offset];
}
//这两个都为取下表操作符的重载,区别是第一个返回值不可以作为左值,第二个返回值可以作为左值,时间复杂度都为O(1) template <class T>
void Array<T>::SetBase(unsigned int newBase)
{
base = newBase;
} template <class T>
void Array<T>::SetLength(unsigned int newLength)
{
T* const newData = new T[newLength];
unsigned int const min = length < newLength ? length : newLength;
for (unsigned int i = ; i < min; ++i)
newData[i] = data[i];
delete[] data;
data = newData;
length = newLength;
} //这两个函数来重设对象的成员,时间复杂度为T(m,n)=min(m,n)*T(T::T(T&))+O(1) template <class T>
Array<T>& Array<T>::operator = (Array<T> const& array)
{
if (this != &array)
{
delete[] data;
base = array.base;
length = array.length;
data = new T[length];
for (unsigned int i = ; i < length; ++i)
data[i] = array.data[i];
}
return this;
} //重载赋值操作符,时间复杂度为O(n)
3.测试主函数main.cpp
#include "Array.cpp"
#include <iostream>
using namespace std; template <class T> void Output(Array<T> array); template <class T>
void Output(Array<T> array)
{
cout << "data:";
for (unsigned int i = array.Base(); i < array.Length(); i++)
{
cout << array.Data()[i] << " ";
}
cout << endl;
cout << "length:" << array.Length()<<endl;
cout << "base:" << array.Base() <<endl;
} int main()
{
cout << "Array()正在执行。。。" << endl;
Array<int> array0 = Array<int>();
Output(array0);
cout << "Array(unsigned int, unsigned int = 0)正在执行。。。" << endl;
Array<int> array1 = Array<int>();
Output(array1);
cout << "Array(Array const&)正在执行。。。" << endl;
Array<int> array2(array1);
Output(array2);
cout << "~Array()正在执行。。。" << endl;
array2.~Array();
Output(array2);
cout << "T const* Data() const,unsigned int Base() const,unsigned int Length() const,"
<< "T const& operator [] (unsigned int) const在Output函数中执行。。。" << endl;
cout << "T& operator [] (unsigned int)正在执行。。。" << endl;
Array<int> array3();
for (unsigned int i = array1.Base(); i < array1.Length() - array1.Base(); i++)
{
array3.Data()[i] = i;
}
Output(array3);
cout << "void SetBase(unsigned int)正在执行。。。" << endl;
array3.SetBase();
Output(array3);
cout << "void SetLength(unsigned int)正在执行。。。" << endl;
array3.SetLength();
Output(array3);
getchar();
return ;
}
4.测试结果

c++实现的Array数据结构的更多相关文章
- 【Codeforces 722C】Destroying Array (数据结构、set)
题意 输入一个含有 n(1≤n≤100000) 个非负整数的 a 数组和一个 1-n 的排列 p 数组,求每次删除 a[p[i]] 后,最大连续子段和(不能跨越被删除的)是多少? 分析 因为都是非负整 ...
- Set,Map与Array,Object对比
Map与Array 数据结构横向对比,用Map和Array分别实现最基本的增删改查: //增 { let theMap=new Map(); let theArray=[]; theMap.set(' ...
- Spark Shuffle原理、Shuffle操作问题解决和参数调优
摘要: 1 shuffle原理 1.1 mapreduce的shuffle原理 1.1.1 map task端操作 1.1.2 reduce task端操作 1.2 spark现在的SortShuff ...
- 【转载】Spark性能优化指南——高级篇
前言 数据倾斜调优 调优概述 数据倾斜发生时的现象 数据倾斜发生的原理 如何定位导致数据倾斜的代码 查看导致数据倾斜的key的数据分布情况 数据倾斜的解决方案 解决方案一:使用Hive ETL预处理数 ...
- 关于R中的mode()和class()的区别
本文原创,转载请注明出处,本人Q1273314690(交流学习) 说明:本文曾经在15年11月在CSDN发过,但是由于CSDN不支持为知笔记的发布为博客的API功能,所以,自今天起,转移到博客园(幸好 ...
- 【转】【技术博客】Spark性能优化指南——高级篇
http://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651745207&idx=1&sn=3d70d59cede236e ...
- [GeekBand] 探讨C++新标准之新语法——C++ 11~14
一. 可变参数模板(Variadic Templates) 在C++11中,出现了参数数目可变的模板,这部分在之前C++高级编程的时候就有学习到. 其实,在C中就有类似的设定.最常用的printf() ...
- JavaScript数组知识网络
JavaScript数据类型 基本数据类型 Boolean Null Number String Symbol Undefined 对象数据类型Object Build-in object Array ...
- Web前端:博客美化:二、鼠标特效
1.获取JS权限 因为是js代码所以需要放在 侧边栏公告 里 没开通之前,有一个申请的链接,点击即可,我是第二天才看到过审的 ^-^ 2.Ctrl+C.Ctrl+V 数组里的文字随自己心情啦 另:30 ...
随机推荐
- 【Better Code】面向切面编程
用AOP改善JavaScript代码http://www.w3cfuns.com/thread-5597323-1-1.html
- android 自动化(1)
学习android自动化测试要感谢一个朋友耐心的指导 环境搭建:(需要java JDK 以及android SDK) JDK:http://www.oracle.com/technetwork/jav ...
- Json 的日期格式转换成DateTime
JSON 的日期形式:”/Date(1242357713797+0800)/” , 下面我们就用以下C#的方法将他转换成DateTime类型: /// <summary> /// Json ...
- Linux学习笔记23——取消线程
一 相关函数 1 发送终止信号 #include <pthread.h> int pthread_cancel(pthread_t thread); 2 设置取消状态 #include & ...
- 用Objective-C的Category特性添加类的属性
http://www.cnblogs.com/wupher/archive/2013/01/05/2845338.html Category是Objective-C中常用的语法特性,通过它可以很方便的 ...
- Nginx+Tomcat的服务器端环境配置详解
这篇文章主要介绍了Nginx+Tomcat的服务器端环境配置详解,包括Nginx与Tomcat的监控开启方法,需要的朋友可以参考下 Nginx+tomcat是目前主流的Javaweb架构,如何让ngi ...
- linux下配置固定ip
今天在VM上装linux6.3,装的时候没有配置ip,虚拟机连接方式选的NAT方式,可以直接上网.我装这几次虚拟机系统只有这次虚拟机上去网了,挺爽.但是问题又出来了,就是我本机Windows远程不上虚 ...
- linux —— shell 编程(文本处理)
导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 基本文本处理 流编辑器sed aw ...
- [置顶] UITableViewCell
UITableViewCellStyle: 四种Cell类型. UITableViewCellSeparatorStyle 分割线类型.(group三种,plain两种) UITableViewCel ...
- python google play
#!/usr/env python #-*- coding: utf-8 -*- import urllib import urllib2 import random import requests ...