[C++] MyList<T>
完成作业型。。。保证无bug,完全没考虑效率。
#include <iostream>
using namespace std; #define DEBUG
#ifdef DEBUG
#define ASSERT(expr) { \
if (!(expr)) { \
cout << "=============== ASSERT(" << #expr << ") failed at line " << __LINE__ \
<< " in function " << __FUNCTION__ << "() " << endl; \
throw(); \
} \
}
#else
#define ASSERT(expr)
#endif template<typename T>
class MyList {
private:
// copy 'cnt' elements from 'src' to 'dest'
// ignore if (cnt == 0)
static void __copy(T* dest, const T* src, int cnt) {
ASSERT(cnt >= );
if (!cnt || src == dest) return; if (src < dest) {
for (int i = cnt-; i >= ; --i)
dest[i] = src[i];
} else {
for (int i = ; i < cnt; ++i)
dest[i] = src[i];
}
} // reverse [start, end]
static void __reverse(T* start, T* end) {
ASSERT(start <= end);
for (int i = ; i <= (end-start)/; ++i) {
T tmp = start[i];
start[i] = end[-i];
end[-i] = tmp;
}
} // qsort [start, end]
// increasingly if (less == true), decreasingly otherwise
static void __qsort(T* start_elem, T* end_elem, bool less) {
T *st = start_elem, *ed = end_elem;
if (st >= ed) return;
const T pivot = *st;
if (less) {
while (st < ed) {
while (st < ed && *ed >= pivot) --ed;
*st = *ed;
while (st < ed && *st <= pivot) ++st;
*ed = *st;
}
} else {
while (st < ed) {
while (st < ed && *ed <= pivot) --ed;
*st = *ed;
while (st < ed && *st >= pivot) ++st;
*ed = *st;
}
}
*st = pivot;
__qsort(start_elem, st-, less);
__qsort(ed+, end_elem, less);
} // deep clone the list form 'src' to 'dest'
static void __clone(MyList* dest, const MyList* src) {
ASSERT(dest && src && dest != src);
dest->zero();
if (! src->m_Size) return; // 'src' is empty dest->initialize(src->m_Size);
__copy(dest->m_List, src->m_List, src->m_Size);
} private:
int m_Size; // current element count
int m_MaxSize; // max element count
T* m_List; // buffer private:
// allocate memory for 16 elements if (m_List == NULL)
// double m_List otherwise
void double_space(void) {
ASSERT(m_Size == m_MaxSize);
if (! m_MaxSize) { // not allocated before
ASSERT(m_List == NULL);
m_MaxSize = ;
m_List = new T[m_MaxSize];
return;
} ASSERT(m_List != NULL);
T* newList = new T[m_MaxSize*];
__copy(newList, m_List, m_Size);
delete[] m_List;
m_List = newList;
m_MaxSize *= ;
} // initialize this with a specific size
void initialize(int size) {
ASSERT(size > );
this->m_Size = this->m_MaxSize = size;
this->m_List = new T[size];
} // set 'this' with all-zero
void zero() {
m_Size = m_MaxSize = ;
m_List = (T*)NULL;
} public:
// constructor: a new empty list
MyList() {
this->zero();
} // constructor: with 'item' repeating 'num' times
MyList(int num, const T& item) {
this->zero();
// ASSERT(num >= 0)
if (num <= ) return; this->initialize(num);
for (int i = ; i < num; ++i) {
m_List[i] = item;
}
return;
} // copy constructor: deep clone from a list
// attention: avoid cloning from itself
MyList(const MyList& lst) {
// ASSERT(this != &lst);
if (this != &lst) {
__clone(this, &lst);
}
} // constructor: with first 'len' elements in 'arr'
MyList(T* arr, int len) {
this->zero(); // ASSERT(len >= 0);
if (len <= ) return;
ASSERT(arr != NULL); this->initialize(len);
__copy(m_List, arr, len);
} // destroctor: free the buffer is allcated before
~MyList() {
if (! m_List) {
ASSERT(m_Size == && m_MaxSize == );
return;
}
delete[] m_List;
this->zero();
} // insert 'item' at the position of 'index'
void insert(int index, const T& item) {
// 'push()' when (index == m_Size)
ASSERT(index >= && index <= m_Size);
if (m_Size == m_MaxSize)
this->double_space(); // __copy: ignored if (m_Size == index)
__copy(m_List+index+, m_List+index, m_Size-index);
m_List[index] = item;
++m_Size;
} // clear current list
void clean() {
m_Size = ;
} // push 'item' to end of the list
void push(const T& item) {
this->insert(m_Size, item); // insert: 'index' = m_Size
} // pop from end of the list
T pop() {
ASSERT(m_Size > );
return m_List[--m_Size];
} // get element count
int get_size() const {
return m_Size;
} // erase elements indexed [start, end]
void erase(int start, int end) {
ASSERT(start >= && end < m_Size);
ASSERT(start <= end); // __copy: ignore if (end == m_Size-1)
__copy(m_List+start, m_List+end+, m_Size--end);
m_Size -= end-start+;
} // get the reference of element indexed 'index'
T& operator [](int index) const {
ASSERT(index >= && index < m_Size);
return m_List[index];
} // get the element indexed 'index'
T get_item(int index) const {
ASSERT(index >= && index < m_Size);
return m_List[index];
} // pick elements index [start, end] to form a new list
// if (end == -1), then pick from 'start' to the last element.
MyList get_item(int start, int end) const {
// specially treat when (end = -1)
if (end == -) {
end = m_Size-;
} // ASSERT(start <= end && start >= 0 && end < m_Size);
if (start <= end && start >= && end < m_Size) {
// if this is empty, 0 <= start <= end < m_Size = 0 is impossible
return MyList(m_List+start, end-start+);
}
return MyList(); // empty
} // count the element 'item' in the list
int count(const T& item) const {
int ret = ;
for (int i = ; i < m_Size; ++i) {
if (m_List[i] == item) ++ret;
}
return ret;
} // remove the element 'item' in the list (at the first present)
void remove(const T& item) {
for (int i = ; i < m_Size; ++i) {
if (m_List[i] == item) {
this->erase(i, i);
return;
}
}
} // like copy construtor, deep clone from 'lst'
// attention: avoid cloning from itself
MyList& operator =(const MyList& lst) {
if (this != &lst) { // a = a
__clone(this, &lst);
}
return *this;
} // add the element 'item' to the end of this list
MyList& operator +=(const T& item) {
this->push(item);
return *this;
} // add the list 'lst' to the end of this list
MyList& operator +=(const MyList& lst) {
MyList tmp = lst;
for (int i = ; i < tmp.m_Size; ++i) {
this->push(tmp.m_List[i]);
}
return *this;
} // sort current list
// increasingly if (less == true), decreasingly otherwise
void sort(bool less = true) {
if (! m_Size) return;
ASSERT(m_List != NULL); __qsort(m_List, m_List + m_Size-, less);
} // reverse current list
void reverse() {
if (! m_Size) return;
ASSERT(m_List != NULL); __reverse(m_List, m_List + m_Size-);
} // merge two list to a new list
template<typename _T>
friend MyList<_T> operator +(const MyList<_T>&, const MyList<_T>&); // merge a list and an element to a new list
template<typename _T>
friend MyList<_T> operator +(const MyList<_T>&, const _T&); // output the list to an ostream
template<typename _T>
friend ostream& operator <<(ostream&, const MyList<_T>&);
}; template<typename T>
MyList<T> operator +(const MyList<T>& lst1, const MyList<T>& lst2) {
MyList<T> ret = lst1;
ret += lst2;
return ret;
} template<typename T>
MyList<T> operator +(const MyList<T>& lst, const T& item) {
MyList<T> ret = lst;
ret += item;
return ret;
} template<typename T>
ostream& operator <<(ostream& os, const MyList<T>& lst) {
os << "[";
for (int i = ; i < lst.m_Size; ++i) {
if (i) os << ", ";
os << lst.m_List[i];
}
os << "]";
return os;
} int main()
{
MyList<int> a, b;
for(int i = ; i < ; ++i) {
a.push(i);
}
// a = [0, 1, 2, 3, 4] a[] = ; // a = [0, 1, 2, 15, 4]
a.sort(); // a = [0, 1, 2, 4, 15]
a.reverse(); // a = [15, 4, 2, 1, 0]
a += ; // a = [15, 4, 2, 1, 0, 12]
for(int i = ; i < a.get_size(); ++i) {
cout << a[i] << endl;
} b = a.get_item(, -); // b = [] *若start > end,返回空数组
b = a.get_item(, -); // b = [1, 0, 12]
a += b; // a = [15, 4, 2, 1, 0, 12, 1, 0, 12]
for(int i = ; i < a.get_size(); ++i)
cout << a.get_item(i) << endl;
cout << a.count() << endl; b.clean(); // b = []
cout << b.get_size() << endl; a.erase(, ); // a = [15, 4, 1, 0, 12]
b = a + a; // b = [15, 4, 1, 0, 12, 15, 4, 1, 0, 12]
b.insert(, ); // b = [15, 4, 1, 116, 0, 12, 15, 4, 1, 0, 12]
b.remove(); // b = [15, 1, 116, 0, 12, 15, 4, 1, 0, 12]
cout << b << endl; MyList<double> c(, 3.14);
for(int i = ; i < ; ++i)
c.push(1.1 * i);
cout << c.get_item(, ) << endl; return ;
}
[C++] MyList<T>的更多相关文章
- 【jq】c#零基础学习之路(5)自己编写简单的Mylist<T>
public class MyList<T> where T : IComparable { private T[] array; private int count; public My ...
- 我的STL之旅 MyList
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> // ...
- MyList 泛型委托
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using S ...
- 仿照ArrayList自己生成的MyList对象
现在需要自己生成一个list集合,基本雷同ArrayList,不使用API的List接口. 实现如下: MyList的代码: public class MyList<T> { privat ...
- #学号 20175201张驰 《Java程序设计》第10周课下作业MyList
参见附件,补充MyList.java的内容,提交运行结果截图(全屏) 课下推送代码到码云 public class MyList { public static void main(String [] ...
- List myList=new ArrayList()的理解
ArrayList不是继承List接口,是实现了List接口.你写成ArrayList arrayList = new ArrayList();这样不会有任何问题.和List list = new A ...
- 写一个MyList
首先定义接口 using System; using System.Collections.Generic; using System.Linq; using System.Text; using S ...
- 36.创建模板mylist
node.h #pragma once //创建模板 template <class T> class Node { public: T t;//数据 Node *pNext;//指针域 ...
- Redis数据库
Redis是k-v型数据库的典范,设计思想及数据结构实现都值得学习. 1.数据类型 value支持五种数据类型:1.字符串(strings)2.字符串列表(lists)3.字符串集合(sets)4.有 ...
随机推荐
- SAX和DOM解析的区别
XML和JSon是ios解析文件的两种形式, 两种方法各有千秋. 1>. XML分为SAX和DOM两种方式 SAX是按顺序逐行读取文件, 查找到符合条件的内容时就会停止, 而DOM是讲内容一次性 ...
- .net单元测试初探
写在前面 组里接手了一个在运行的票台系统,包括收银,客户体验,店内商超等子系统,要求将服务端进行云端化,以应对分店的增多和决策层对于数据的需要,而随着时间的退役和各种收费策略的改变,促销活动的展开等, ...
- 大话设计模式之<一>计算器的深思
一个面试题引发的深思,试问我们会如何用面向对象的语言写一个计算器,自从我学习了高级编程之后,面向对象的思想也算是深入在我的编程思想里面,从最开始学习的人类到各色人种,及动物到猫狗鼠这样的例子,我甚至听 ...
- 通过select的value值来改变textarea内字体和大小
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- wxPython入门练习代码 一
Bare.py: #1.导入必须的wxPython包 import wx #2.子类化wx应用程序类 class App(wx.App): #3.定义应用程序初始化方法 def OnInit(self ...
- 1310. ACM Diagnostics
http://acm.timus.ru/problem.aspx?space=1&num=1310 题目中说的 “the lexicographically increasing list” ...
- 杭电--1102--Constructing Roads--并查集
Constructing Roads Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- java获取当前时间前一周、前一月、前一年的时间
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar c = Calend ...
- (DFS、bitset)AOJ-0525 Osenbei
题目地址 简要题意: 给出n行m列的0.1矩阵,每次操作可以将任意一行或一列反转,即这一行或一列中0变为1,1变为0.问通过任意多次这样的变换,最多可以使矩阵中有多少个1. 思路分析: 行数比较小,先 ...
- http——tinyhttp分析
1.前言: 1)tinyhttpd是一个500行+的http服务器 2)支持迭代和多线程并发两种服务器模型 3)支持GET和POST方法 4)支持CGI(fork.execl方式) 5)虽然响应的ht ...