完成作业型。。。保证无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. win7/8/10安装过程中将动态磁盘转为basic

    在分区界面运行Shift+F10 在命令窗口运行Diskpart list diskpart select disk n(n为磁盘号) clean convert xxx PS:xxx代表要转换的结果 ...

  2. spring开发的总结

    1,当出现无法创建bean,( Error creating bean with name 'fileUploadService': Injection of resource dependencie ...

  3. pthreads 2.0.10 test

    CentOS 6.3 cd /root mkdir pthreads //get php-5.6 and install zts version wget cn2.php.net/get/php-5. ...

  4. 通过淘宝IP地址库获取IP位置

    地址:http://ip.taobao.com/ 提供的服务包括: 1. 根据用户提供的IP地址,快速查询出该IP地址所在的地理信息和地理相关的信息,包括国家.省.市和运营商. 2. 用户可以根据自己 ...

  5. Ubuntu 安装和使用 Zip – rar – 7zip

    http://www.rongxuan.org/2013/08/13/ubuntu-%E5%AE%89%E8%A3%85%E5%92%8C%E4%BD%BF%E7%94%A8-zip-rar-7zip ...

  6. Mysql数据库的一些命令_LInux

    查看当前数据库的版本,因为有些命令在不同版本中 用法有可能不一样,注意 -V 是大写字母V[root@localhost ~]# mysqladmin -Vmysqladmin  Ver 8.42 D ...

  7. hihoCoder#1121

    刚开始学习C语言,准备在做hiho的题目的过程中来学习,在此进行记录,如果代码中有错误或者不当的地方还请指正. 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 大家好,我 ...

  8. schema约束和引入

    schema的概述 schema约束同为xml文件的约束模式语言之一, 最大的作用是为了验证xml文件的规范性的. 是为了解决dtd约束不够的问题, 相应的他的配置就变得比较复杂 schema本身就是 ...

  9. play(1) 第一个简单的应用

    去年去了一家公司,公司要求要回使用play,所以在几天的时间内猛学习了一段时间play,发现play!有很多优点:简单,小巧,高开发效率,集成很多功能,容易调试.现在虽然已经不在那家公司,没有使用pl ...

  10. what we do and how we behave

    It comes after a report last week revealed the "brutal" treatment of terror suspects by th ...