完成作业型。。。保证无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. http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html(转载)(原作者:AstralWind)

      Python正则表达式指南   本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例.本文的内容不包括如何编写高效的正则表达式.如何优 ...

  2. 微信支付之扫码支付开发:我遇到的坑及解决办法(附:Ecshop 微信支付插件)

    前段时间帮一个朋友的基于ecshop开发的商城加入微信扫描支付功能,本以为是很简单的事儿——下载官方sdk或开发帮助文档,按着里面的做就ok了,谁知折腾了两三天的时间才算搞定,中间也带着疑问在网上找了 ...

  3. webfrrm基础

    一.B/S和C/S 1.C/S C/S 架构是一种典型的两层架构,其全程是Client/Server,即客户端服务器端架构,其客户端包含一个或多个在用户的电脑上运行的程序,而服务器端有两种,一种是数据 ...

  4. IIS7 WebAPI 404.0 Error

    <system.webServer><modules runAllManagedModulesForAllRequests="true"/></sys ...

  5. TFS Workspace 更改电脑名称

    不小心改了计算机名称 导致VS在保存项目的时候,包如下错误: 解决方法: 第一步: 第二步:输入如下片段 tf workspaces /updateComputerName:旧计算机名称  /coll ...

  6. RSA大会播报 – 2014最佳安全博客提名(国外篇)

    最佳企业安全博客提名:     Juniper(网络厂商,不用多介绍):http://forums.juniper.net/t5/Security-Mobility-Now/bg-p/networki ...

  7. iOS安全—阻止tweak注入hook api

    http://blog.csdn.net/zcrong/article/details/51617348 在Other Linker Flags中添加: -Wl,-sectcreate,__RESTR ...

  8. Android 设置ListView当前显示的item

    项目中可能会有这种需求:动态设置ListView显示的item 这种需求可能会出现在不同的情况下,有的是打开页面就要显示在特定的位置,也有的是浏览列表时实时更新数据并且改变了集合中数据,或者是某种条件 ...

  9. AWS-CDH5.5安装-安装

    1.安装MySQL [root@ip---- mysql]# rpm -ivh MySQL-server--.el6.x86_64.rpm MySQL-client--.el6.x86_64.rpm ...

  10. rocksDB 安装问题简单介绍

    前一段时间准备测试rocksdb,按照帖子和官网的例子,在安装过程中遇到一些问题.这里给出的是在Ubuntu下安装python使用的版本. 首先,要感谢这些帖子对我的帮助: 1:http://tech ...