more effective c++——Item M30 代理类(一)多维数组的实现
来源:互联网 发布:mysql 判断奇数偶数 编辑:程序博客网 时间:2024/04/19 07:24
代理类:用一个类来实现我们所需要的而 C++语言中并没有提供的东西,用户并不需要该类的具体实现
总结:
1.模板类中,输入输出操作符重载不能在模板类外部实现
2.数组类需要提供基本的操作:单参构造,拷贝构造,赋值操作,输出操作符
3.n维数组类持有n-1维数组的二级指针
4.多维数组可以看作n-1维数组的叠加,构造时需要先构造row个n-1个维数组的指针,然后再次为这些指针分配空间,析构时先删除n-1维数组的内存,再删除存放指针的内存
5.不要模板类型——typename
一维数组的实现:
#pragma once#include <iostream>//#include <afx.h>using namespace std;template<typename T>class Array1D {public: Array1D(const int size) :m_isize(size), m_array(new T[m_isize]) {} ~Array1D() { delete[] m_array; } Array1D<T> & operator=(const Array1D<T> &rhl); const T & operator[](const int index) const; T & operator[](const int index); friend ostream &operator<< (ostream & os, const Array1D<T> &rhl) { for (int i = 0; i < rhl.m_isize; ++i) { cout << rhl[i]; if (i != rhl.m_isize - 1) { cout << " "; } } cout << endl; return os; }private: int m_isize; T *m_array;};template<typename T>inline Array1D<T> & Array1D<T>::operator=(const Array1D<T> &rhl){ if (m_array == rhl.m_array) { return *this; } delete[] m_array; m_isize = rhl.m_isize; m_array = new T[m_isize]; for (int i = 0;i < m_isize;++i) { m_array[i] = rhl.m_array[i]; } return *this;}template<typename T>inline const T & Array1D<T>::operator[](const int index) const{ return m_array[index];}template<typename T>inline T & Array1D<T>::operator[](const int index){ return m_array[index];}inline void test_array1d(){ int isize = 10; Array1D<int> arr1d(isize); for (int i = 0; i < isize; ++i) { arr1d[i] = i * 2 + 1; } cout << arr1d;}
二维数组的实现:
#pragma once#include "Array1D.h"#include <iostream>using namespace std;template<typename T>class Array2D {public: Array2D(const int row,const int col) :m_irow(row), m_icol(col) { m_array = new Array1D<T> *[m_irow]; for (int i = 0; i < m_irow;++i) { m_array[i] = new Array1D<T>(m_icol); } } ~Array2D() { for (int i = 0; i < m_irow; ++i) { delete m_array[i]; } delete[] m_array; } Array2D<T> & operator=(const Array2D<T> &rhl); const Array1D<T> & operator[](const int index) const; Array1D<T> & operator[](const int index); friend ostream &operator<< (ostream & os, const Array2D<T> &rhl) { for (int i = 0; i < rhl.m_irow; ++i) { cout << rhl[i]; } cout << endl; return os; }private: int m_irow; int m_icol; Array1D<T> **m_array;};template<typename T>inline Array2D<T> & Array2D<T>::operator=(const Array2D<T> &rhl){ if (m_array == rhl.m_array) { return *this; } for (int i = 0; i < m_irow; ++i) { delete m_array[i]; } delete[] m_array; m_irow = rhl.m_irow; m_icol = rhl.m_icol; m_array = new Array1D<T> *[m_irow]; for (int i = 0; i < m_irow; ++i) { m_array[i] = new Array1D<T>(m_icol); *m_array[i] = *rhl.m_array[i]; } return *this;}template<typename T>inline const Array1D<T> & Array2D<T>::operator[](const int index) const{ return *m_array[index];}template<typename T>inline Array1D<T> & Array2D<T>::operator[](const int index){ return *m_array[index];}inline void test_array2d(){ int row = 5; int col = 7; Array2D<int> arr2d(row,col); for (int i = 0; i < row; ++i) { for (int j = 0 ;j < col;++j) { arr2d[i][j] = i + i*j; } } cout << arr2d;}
三维数组的实现:
#pragma once#include "Array2D.h"#include <iostream>using namespace std;template<typename T>class Array3D {public: Array3D(const int len, int wid, int hight) :m_len(len), m_wid(wid), m_hight(hight) { m_array = new Array2D<T> *[len]; for (int i = 0;i < len;++i) { m_array[i] = new Array2D<T>(wid, hight); } } ~Array3D() { for (int i = 0; i < m_len; ++i) { delete m_array[i]; } delete[] m_array; } Array3D<T> & operator=(const Array3D<T> &rhl); const Array2D<T> & operator[](const int index) const; Array2D<T> & operator[](const int index); friend ostream &operator<< (ostream & os, const Array3D<T> &rhl) { for (int i = 0; i < rhl.m_len; ++i) { cout << rhl[i]; } cout << endl; return os; }private: int m_len; int m_wid; int m_hight; Array2D **m_array;};template<typename T>const Array2D<T> & Array3D<T>::operator[](const int index) const{ return *m_array[index];}template<typename T>inline Array2D<T>& Array3D<T>::operator[](const int index){ return *m_array[index];}template<typename T>inline Array3D<T>& Array3D<T>::operator=(const Array3D<T>& rhl){ if (m_array == rhl.m_array) { return *this; } for (int i = 0; i < m_len; ++i) { delete m_array[i]; } delete[] m_array; m_len = rhl.m_len; m_wid = rhl.m_wid; m_hight = rhl.m_hight; m_array = new Array2D<T> *[m_len]; for (int i = 0; i < m_irow; ++i) { m_array[i] = new Array2D<T>(m_wid,m_hight); *m_array[i] = *rhl.m_array[i]; } return *this;}
0 0
- more effective c++——Item M30 代理类(一)多维数组的实现
- more effective c++——Item M30 代理类(二)通过代理类识别operator[]的读写操作
- more effective c++——Item M30 代理类(三)隐式类型转换与代理类
- More Effective C++ Item M30:代理类
- more effective c++——Item M29 引用计数(一)简略的rfstring类设计和写时拷贝
- more effective c++——Item M29 引用计数(三)带引用计数的基类的实现
- more effective c++——Item M29 引用计数(二)带静态成员变量的rfstring类实现
- more effective c++ Item M4 书上写的代理类实现不了,需要修改一下哟
- More Effective C++:Item 27
- More Effective C++:Item 27
- 《more effective c++》Item M1:指针与引用的区别
- 《More Effective C++》 Item M1:指针与引用的区别
- 《More Effective C++》学习心得(一)
- 《More Effective C++》学习心得(三) 不要以多态性处理类的对象数组
- read Item 25 of《More Effective C++》
- 【more effective c++读书笔记】【第5章】技术(6)——Proxy classes(代理类)
- 《More Effective C++》读书笔记一
- 《more effective c++》Item M3:不要对数组使用多态
- 集合
- Codeforces Round #411 (Div. 2) D 规律题
- Adapter模式
- 焦虑的程序员
- spring cloud 学习 链接
- more effective c++——Item M30 代理类(一)多维数组的实现
- 前端的一些CSS样式
- maven常用命令
- NYOJ-1249-物资调度
- 什么是Build path
- Hadoop入门基础教程 Hadoop之服务器基础环境搭建
- 架构探险总结
- 给Python中通过urllib2.urlopen获取网页的过程中,添加gzip的压缩与解压缩支持
- Java之实现验证码