完成作业型。。。保证无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>的更多相关文章

  1. 【jq】c#零基础学习之路(5)自己编写简单的Mylist<T>

    public class MyList<T> where T : IComparable { private T[] array; private int count; public My ...

  2. 我的STL之旅 MyList

    #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> // ...

  3. MyList 泛型委托

    using System; using System.Collections; using System.Collections.Generic; using System.Linq; using S ...

  4. 仿照ArrayList自己生成的MyList对象

    现在需要自己生成一个list集合,基本雷同ArrayList,不使用API的List接口. 实现如下: MyList的代码: public class MyList<T> { privat ...

  5. #学号 20175201张驰 《Java程序设计》第10周课下作业MyList

    参见附件,补充MyList.java的内容,提交运行结果截图(全屏) 课下推送代码到码云 public class MyList { public static void main(String [] ...

  6. List myList=new ArrayList()的理解

    ArrayList不是继承List接口,是实现了List接口.你写成ArrayList arrayList = new ArrayList();这样不会有任何问题.和List list = new A ...

  7. 写一个MyList

    首先定义接口 using System; using System.Collections.Generic; using System.Linq; using System.Text; using S ...

  8. 36.创建模板mylist

    node.h #pragma once //创建模板 template <class T> class Node { public: T t;//数据 Node *pNext;//指针域 ...

  9. Redis数据库

    Redis是k-v型数据库的典范,设计思想及数据结构实现都值得学习. 1.数据类型 value支持五种数据类型:1.字符串(strings)2.字符串列表(lists)3.字符串集合(sets)4.有 ...

随机推荐

  1. F2工作流引擎这工作流引擎体系架构(二)

    F2工作流体系架构概览图 为了能更好的了解F2工作流引擎的架构体系,花了些时间画了整个架构的体系图.F2工作流引擎遵循参考WFCM规范,目标是实现轻量级的工作流引擎,支持多种数据库及快速应用到任何基于 ...

  2. CheckedListBoxControl 实现复选框的单选与多选功能

    由于工作需要,需要实现复选框的单选与多选功能,找了好多资料都不是很全,经过两天苦苦的挖挖挖,终于完成啦O(∩_∩)O哈哈~ 用DEV控件中的CheckedListBoxControl控件,当然VS中的 ...

  3. Proxy Pattern(Java动态代理和cglib的实现)

    代理模式:给某一个对象提供代理对象,由代理对象控制具体对象的引用. 代理,指的就是一个角色对表另一个角色采取行动,就生活中,一个红酒厂商,是不会直接把红酒零销给客户的,都是通过代理完成他的销售业务.而 ...

  4. 【软件工具】Driver Booster3永久激活法

    原作者網址:erik2041999 (YouTube) 1.安装Driver Booster3 (档案已附) 2.使用此启动码0187E-B9764-4D9FA-211B3断网启动 3.保持断网状态并 ...

  5. 极光推送Jpush(v3)服务端PHP版本集成(V3版本只调用推送API)

    因为版本升级,极光推送的API也有了V3,功能也更丰富了,但是对于我们有的用户来说,我们还是只需要调用推送的API就够了. 下载了一份PHP服务端的SDK(下载地址:http://docs.jpush ...

  6. css 背景透明文字(内容)不透明三种实现方法

    好久没写博客了.以前还想着最少一个月抽空写几篇.结果没做到O(∩_∩)O~~.好吧.现在努力,继续坚持. 看着以前写的东西,感觉自己在逐渐成长. 先上图: 本文主要记录如上图一样的.文字或内容不透明, ...

  7. Codeforces Round #383 (Div. 2) 解题报告

    本来是打算所有半夜进行的CF都不参加的,但看到这次比赛22:35就开始,还是没有忍住orz--晚上总是不够清醒,做题思维不如白天活跃,低级错误常常出现.出的比较早的C因为一个书写错误有点小bug,在比 ...

  8. (DFS、bitset)AOJ-0525 Osenbei

    题目地址 简要题意: 给出n行m列的0.1矩阵,每次操作可以将任意一行或一列反转,即这一行或一列中0变为1,1变为0.问通过任意多次这样的变换,最多可以使矩阵中有多少个1. 思路分析: 行数比较小,先 ...

  9. SQL Server数据库性能优化之SQL语句篇【转】

    SQL Server数据库性能优化之SQL语句篇http://www.blogjava.net/allen-zhe/archive/2010/07/23/326927.html 近期项目需要, 做了一 ...

  10. 配置Java开发IDE

    http://www.cnblogs.com/feichexia/archive/2012/11/07/Vim_JavaIDE.html