c/c++ 模板与STL小例子系列<一> 自建Array数组

自建的Array数组,提供如下对外接口

方法 功能描述
Array() 无参数构造方法,构造元素个数为模板参数个的数组
Array(int length) 有参数构造方法,构造元素个数为参数length个的数组
~Array() 析构函数
int size() 返回数组中元素的个数
T& get(int num) 返回数组中指定下标的元素的引用
void set(T data, int num) 设置指定下标元素的值
T& operator [] (int num) 重载类型T的[]函数

下面代码用使用了私有元素size1,本来想用size命名,但是因为在公有方法里声明了int size()方法,编译不过去,所以起名为size1,感觉很奇怪。

my_array.h

ifndef __my_array__
#define __my_array__
template<typename T, int n>
class Array {
public:
Array();
Array(int length);
~Array();
T& get(int idx);
T& operator[](int idx);
void set(T data, int idx);
int size();
private:
T* pt;
int size1; };
//构造函数
template<typename T, int n>
Array<T, n>::Array(){
pt = new T[n];
size1 = n;
}
//构造函数
template<typename T, int n>
Array<T, n>::Array(int length){
pt = new T[length];
size1 = length;
}
//析构函数
template<typename T, int n>
Array<T, n>::~Array(){
delete [] pt;
}
//取得数组元素的个数
template<typename T, int n>
int Array<T,n>::size(){
return size1;
}
//得到指定下标的元素
template<typename T, int n>
T& Array<T, n>::get(int num){
if(num >= size1 || num < 0){
//异常
}
else{
return pt[num];
}
}
//设定指定下标元素的值
template<typename T, int n>
void Array<T, n>::set(T data, int num){
if(num >= size1 || num < 0){
//异常
}
else{
pt[num] = data;
}
}
//重载元素类型的[]函数
template<typename T, int n>
T& Array<T, n>::operator[](int num){
if(num >= size1 || num < 0){
//异常
}
else{
return *(pt + num);
}
}
#endif

测试程序:

#include <iostream>
#include <string>
#include "my_array.h" using namespace std; int main(){
Array<int, 5> ary;
for(int i = 0; i < ary.size(); ++i){
ary.set(i * 10, i);
cout << ary.get(i) << " ";
cout << ary[i] << ", ";
}
cout << endl; Array<string, 3> asr(4);
for(int i = 0; i < asr.size(); ++i){
asr.set("AAA", i);
cout << asr.get(i) << " ";
cout << asr[i] << ", ";
}
cout << endl;
return 0;
}

c/c++ 模板与STL小例子系列<一 >自建Array数组的更多相关文章

  1. c/c++ 模板与STL小例子系列<三> traits

    c/c++ 模板与STL小例子系列 traits 对这个概念,还是处于懵逼的状态,初步体会就是,为了解决类型之间的转换问题. 从一个类型为A的指针,转化到类型为B的指针,中间需要用void*来作为中介 ...

  2. c/c++ 模板与STL小例子系列<二> 模板类与友元函数

    c/c++ 模板与STL小例子系列 模板类与友元函数 比如某个类是个模板类D,有个需求是需要重载D的operator<<函数,这时就需要用到友元. 实现这样的友元需要3个必要步骤 1,在模 ...

  3. 【JavaScript数据结构系列】01-数组Array

    [JavaScript数据结构系列]01-数组Array 码路工人 CoderMonkey 转载请注明作者与出处 # [JavaScript数据结构系列] # 01-数组Array 数组: 是有序的元 ...

  4. HDU 4520 小Q系列故事――最佳裁判(STL)

    小Q系列故事——最佳裁判 Problem Description 过去的2012年对小Q来说是很悲催的一年,失恋了12次,每次都要郁闷1个来月. 好在小Q是个体育迷,在最痛苦的时候,他常常用观看各种体 ...

  5. STL学习系列之一——标准模板库STL介绍

    库是一系列程序组件的集合,他们可以在不同的程序中重复使用.C++语言按照传统的习惯,提供了由各种各样的函数组成的库,用于完成诸如输入/输出.数学计算等功能. 1. STL介绍 标准模板库STL是当今每 ...

  6. C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用

    摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动 ...

  7. C++的标准模板库STL中实现的数据结构之链表std::list的分析与使用

    摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解,即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第二篇.主要针对线性表中的链表 ST ...

  8. backbone入门小例子

    最近听了个backbone的分享,为了避免听不懂,就先做了个小例子 例子很简单,效果如下 基本视图模板: <script type="tex/template" id=&qu ...

  9. Vue2.x源码学习笔记-从一个小例子查看vm实例生命周期

    学习任何一门框架,都不可能一股脑儿的从入口代码从上到下,把代码看完, 这样其实是很枯燥的,我想也很少有人这么干,或者这么干着干着可能干不下去了. 因为肯定很无聊. 我们先从一个最最简单的小例子,来查看 ...

随机推荐

  1. MySQL系列详解十:MySQL多源复制演示-技术流ken

    前言 多源复制即多主一从结构,多个主服务器端的数据都会同步到后端一个从服务器上面.至于为什么要做多源复制下面的总结很到位. 1.灾备作用:将各个库汇总在一起,就算是其他库都挂了(整个机房都无法连接了) ...

  2. .net里的ref、out、params参数。

    1.ref參數 class Program    {        static void Main(string[] args)        {            int a = 10;    ...

  3. Python GUI

    1.flexx Flexx 是一个纯Python工具包,用来创建图形化界面应用程序.其使用 Web 技术进行界面的渲染.你可以用Flexx来创建桌面应用,同时也可以导出一个应用到独立的 HTML 文档 ...

  4. 利用OpenCV给图像添加中文标注

    利用OpenCV给图像添加中文标注 : 参考:http://blog.sina.com.cn/s/blog_6bbd2dd101012dbh.html  和https://blog.csdn.net/ ...

  5. [android] 在不同的activity之间传递数据

    新建一个activity,继承Activity 清单文件中进行配置,添加<activity/>节点 设置名称 android:name=”.类名” 点 代表的是当前包名,也可以不写 新建一 ...

  6. 如何用ftp上传静态网站到虚拟空间

    ftp是一种网络传输协议,你要上传网站到空间首先你要安装一个FTP软件,你申请的空间有一个网址.账号.密码之类的,你打开FTP输入这些链接就可以准备上传网站了,软件打开有一个本地界面,还有一个空间界面 ...

  7. laravel常见异常解决

    requested URL not found http://stackoverflow.com/questions/21458080/the-requested-url-projectname-us ...

  8. thinkphp3.2模块名如何不区分大小写?

    thinkphp3.2中已配置:'URL_CASE_INSENSITIVE' => true,对于控制器及操作名大小写都可以,但仍对于模块名的大小写就运行机制出错,比如:http://www.x ...

  9. 将Y-m-d转换为Y年m月d日

    自己编写的,不能直接套用,理解后可自行变化: $var=explode(' ',$res['act_starting']); $var1=$var[0];          $time=explode ...

  10. [转载]Web Service到底是什么

    转自:http://blog.csdn.net/wooshn/article/details/8069087/  武僧的专栏 一.序言 大家或多或少都听过WebService(Web服务),有一段时间 ...