该次项目对所有的编程技能提升很大,虽然写的代码不是很完美,但是对我个人来说是能力上的巨大提升。

本工程的亮点的map和set全部基于链表实现,map是改造了双向循环链表,set是基于链表,但是在插入数据前进行重复性判断(我也参考csdn写了一个基于Rbtree版本,但是感觉不是自己的原创,就不放上来了,嘿嘿,给老师笔芯了 (´▽`ʃ♡ƪ))。

vector容器实现

vector底层采用数组实现,并初始化了三个指针:T m_begin; // 起始位置、T m_end; //结束位置、T* m_storagetail; //申请内存末尾

vector实现了以下函数

  1. template<typename T>
  2. class KVector
  3. {
  4. public:
  5. KVector();
  6. KVector(int n, const T& val);
  7. KVector(const KVector<T>& other);
  8. ~KVector();
  9. T at(int n);
  10. void push_back(T val);
  11. void pop_back();
  12. void sort();
  13. void clear();
  14. int find(T val);
  15. bool empty();
  16. void printKVector();
  17. size_t size()const;
  18. size_t capacity()const;
  19. void reserve(size_t n);
  20. void insert(int n, T val);
  21. void erase(int n);
  22. /*class iterator
  23. {
  24. public:
  25. bool operator!=()
  26. {
  27. return m_begin != m_end;
  28. }
  29. };*/
  30. typedef T* iterator;
  31. iterator begin()const;
  32. iterator end()const;
  33. private:
  34. T* m_begin; // 起始位置
  35. T* m_end; //结束位置
  36. T* m_storagetail; //申请内存末尾
  37. };

接下来分别讲解函数:

基础构造函数:

初始化三个指针,初始化vector底层数组(容量为0),三个指针的位置指向数组的头部。

  1. template<typename T>
  2. KVector<T>::KVector()
  3. {
  4. m_begin = m_end = m_storagetail = nullptr;
  5. m_begin = new T[0];
  6. m_storagetail = m_end = m_begin;
  7. }

n个元素的构造函数:

初始化三个指针,初始化vector底层数组(容量为n),一层循环写入val,m_begin指针指向数组头部,m_storagetail 、m_end两个指针指向数组头部偏移n(当前数组尾部)。

  1. template<typename T>
  2. KVector<T>::KVector(int n, const T& val)
  3. {
  4. m_begin = m_end = m_storagetail = nullptr;
  5. m_begin = new T[n];
  6. for (int i = 0; i < n; i++)
  7. {
  8. m_begin[i] = val;
  9. }
  10. m_storagetail = m_end = m_begin + n;
  11. }

vector拷贝构造函数:

初始化三个指针,计算拷贝vector的内存容量,并用两倍的该容量开辟新数组(提前开辟空间)。计算计算拷贝vector的元素个数,一层循环复制元素,m_begin指针指向数组头部,、m_end指针指向数组元素末尾,m_storagetail 指针指向数组内存容量末尾。

  1. template<typename T>
  2. KVector<T>::KVector(const KVector<T>& other)
  3. {
  4. m_begin = m_end = m_storagetail = nullptr;
  5. T temp = other.m_storagetail - other.m_begin;
  6. m_begin = new T[2 * temp];
  7. T n = other.m_end - other.m_begin;
  8. for (int i = 0; i < n; i++)
  9. {
  10. m_begin[i] = other.m_begin[i];
  11. }
  12. m_end = m_begin + n;
  13. m_storagetail = m_begin + temp;
  14. }

析构函数:

调用clear()

  1. template<typename T>
  2. KVector<T>::~KVector()
  3. {
  4. clear();
  5. }

T at(int n)函数:

查找函数,直接返回n位置元素。

  1. template<typename T>
  2. T KVector<T>::at(int n)
  3. {
  4. return this->m_begin[n];
  5. }

void push_back(T val)函数:

当元素末尾指针不等于内存末尾指针时,计算元素末尾位置,正常添加数据,偏移指针。

当元素末尾指针等于内存末尾指针时,先开辟2 * n + 1空间的内存,然后添加数据,偏移指针(因为初始时三个指针都是空指针,不加1,不能正常插入数据)。

  1. template<typename T>
  2. void KVector<T>::push_back(T val)
  3. {
  4. if (m_end != m_storagetail)
  5. {
  6. T n = m_end - m_begin;
  7. m_begin[n] = val;
  8. m_end++;
  9. }
  10. else
  11. {
  12. size_t n = size();
  13. reserve(2 * n + 1);//当vector为null,需要加1;
  14. m_begin[n] = val;
  15. m_end++;
  16. }
  17. }

void pop_back()函数:

当vector内有数据时,最后一个数据清除,元素末尾指针向前偏移。

  1. template<typename T>
  2. void KVector<T>::pop_back()
  3. {
  4. if (m_end - m_begin)
  5. {
  6. m_begin[m_end - m_begin] = 0;
  7. m_end--;
  8. }
  9. }

void sort()函数:

简单两层循环的冒泡排序。

  1. template<typename T>
  2. void KVector<T>::sort()
  3. {
  4. for (int i = 0; i < size(); i++)
  5. {
  6. for (int j = 0; j < size() - 1; j++)
  7. {
  8. if (m_begin[j] > m_begin[j + 1])
  9. {
  10. T temp = m_begin[j + 1];
  11. m_begin[j + 1] = m_begin[j];
  12. m_begin[j] = temp;
  13. }
  14. }
  15. }
  16. }

void clear()函数:

当vector内有数据时,删除底层数组,三个指针置空。

  1. template<typename T>
  2. void KVector<T>::clear()
  3. {
  4. if (m_begin == nullptr)
  5. {
  6. return;
  7. }
  8. delete[] m_begin;
  9. m_begin = m_end = m_storagetail = nullptr;
  10. }

int find(T val)函数:

循环遍历,找到返回位置,找不到返回-1。

  1. template<typename T>
  2. int KVector<T>::find(T val)
  3. {
  4. for (int i = 0; i < size(); i++)
  5. {
  6. if (m_begin[i] == val)
  7. {
  8. return i;
  9. }
  10. }
  11. return -1;
  12. }

bool empty()函数:

元素开始、末尾指针不相等。

  1. template<typename T>
  2. bool KVector<T>::empty()
  3. {
  4. return (m_begin == m_end);
  5. }

void printKVector()函数:

计算元素个数,循环打印。

  1. template<typename T>
  2. void KVector<T>::printKVector()
  3. {
  4. T n = this->m_end - this->m_begin;
  5. for (int i = 0; i < n; i++)
  6. {
  7. std::cout << m_begin[i] << " ";
  8. }
  9. std::cout << std::endl;
  10. }

size_t size()const函数:

元素开始、末尾指针相减。

  1. template <typename T>
  2. size_t KVector<T>::size()const
  3. {
  4. return m_end - m_begin;
  5. }

size_t capacity()const函数:

容量末尾指针与元素开始指针相减。

  1. template <typename T>
  2. size_t KVector<T>::capacity()const
  3. {
  4. return m_storagetail - m_begin;
  5. }

void reserve(size_t n)函数:

如果开辟空间小于当前空间,忽略。开辟N容量的新数组,复制原数组到新数组,删除原数组,偏移三个指针。

  1. void KVector<T>::reserve(size_t n)
  2. {
  3. size_t oldsize = size();
  4. if(n <= capacity())
  5. {
  6. return;
  7. }
  8. else
  9. {
  10. T* newsize = new T[n];
  11. /*for (int i = 0; i < oldsize; i++)
  12. {
  13. newsize[i] = m_begin[i];
  14. }*/
  15. memcpy(newsize, m_begin, sizeof(T) * size());
  16. delete[] m_begin;
  17. m_begin = newsize;
  18. m_end = m_begin + oldsize;
  19. m_storagetail = m_begin + n;
  20. }
  21. }

void insert(int n, T val)函数:

开辟一个新数组,复制n位置之前的元素,插入val,复制原数组n之后的数据,删除原数组,偏移三个指针。

  1. template<typename T>
  2. void KVector<T>::insert(int n, T val)
  3. {
  4. size_t oldsize = size();
  5. size_t oldcapacity = capacity();
  6. T* newsize = new T[oldcapacity * 2];
  7. for (int i = 0; i < n; i++)
  8. {
  9. newsize[i] = m_begin[i];
  10. }
  11. newsize[n] = val;
  12. for (int j = n ; j < size() + 1; j++)
  13. {
  14. newsize[j + 1] = m_begin[j];
  15. }
  16. delete[] m_begin;
  17. m_begin = newsize;
  18. m_end = m_begin + oldsize + 1;
  19. m_storagetail = m_begin + oldcapacity;

void erase(int n)函数:

n位置开始整体向前平移,元素末尾指针前移。

  1. template<typename T>
  2. void KVector<T>::erase(int n)
  3. {
  4. for (int i = n; i < size(); i++)
  5. {
  6. m_begin[i] = m_begin[i + 1];
  7. }
  8. m_end--;
  9. }

iterator begin()const函数:

返回开始指针

  1. template<typename T>
  2. typename KVector<T>::iterator KVector<T>::begin() const
  3. {
  4. return m_begin;
  5. }

iterator end()const函数:

返回元素末尾指针

  1. template<typename T>
  2. typename KVector<T>::iterator KVector<T>::end() const
  3. {
  4. return m_end;
  5. }

stack容器实现

stack底层hevector一样采用数组实现,并初始化了三个指针:T m_begin; // 起始位置、T m_end; //结束位置、T* m_storagetail; //申请内存末尾

stack实现以下函数

  1. template<typename T>
  2. class KStack
  3. {
  4. public:
  5. KStack();
  6. ~KStack();
  7. bool empty();
  8. T peek();
  9. void pop();
  10. void push(T val);
  11. size_t search(T val);
  12. size_t size();
  13. void reserve(size_t n);
  14. typedef T* iterator;
  15. iterator begin()const;
  16. iterator end()const;
  17. private:
  18. T* m_begin; // 起始位置
  19. T* m_end; //结束位置
  20. T* m_storagetail; //申请内存末尾
  21. };

构造函数

初始化三个指针,初始化底层数组(容量为0),三个指针的位置指向数组的头部。

  1. template<typename T>
  2. KStack<T>::KStack()
  3. {
  4. m_begin = m_end = m_storagetail = nullptr;
  5. m_begin = new T[0];
  6. m_storagetail = m_end = m_begin;
  7. }

析构函数

当stack内有数据时,删除底层数组,三个指针置空。

  1. if (m_begin == nullptr)
  2. {
  3. return;
  4. }
  5. delete[] m_begin;
  6. m_begin = m_end = m_storagetail = nullptr;

bool empty()函数

元素开始、末尾指针不相等。

  1. template<typename T>
  2. bool KStack<T>::empty()
  3. {
  4. return (m_begin == m_end);
  5. }

T peek()函数

返回末尾最后一个元素。

  1. template<typename T>
  2. T KStack<T>::peek()
  3. {
  4. return m_begin[m_end - m_begin - 1];
  5. }

void pop()函数

当stack内有数据时,最后一个数据清除,元素末尾指针向前偏移。

  1. template<typename T>
  2. void KStack<T>::pop()
  3. {
  4. if (m_end - m_begin)
  5. {
  6. m_begin[m_end - m_begin] = 0;
  7. m_end--;
  8. }
  9. }

void push(T val)函数

当元素末尾指针不等于内存末尾指针时,计算元素末尾位置,正常添加数据,偏移指针。

当元素末尾指针等于内存末尾指针时,先开辟2 * n + 1空间的内存,然后添加数据,偏移指针(因为初始时三个指针都是空指针,不加1,不能正常插入数据)。

  1. template<typename T>
  2. void KStack<T>::push(T val)
  3. {
  4. if (m_end != m_storagetail)
  5. {
  6. T n = m_end - m_begin;
  7. m_begin[n] = val;
  8. m_end++;
  9. }
  10. else
  11. {
  12. size_t n = size();
  13. reserve(2 * n + 1);
  14. m_begin[n] = val;
  15. m_end++;
  16. }
  17. }

size_t search(T val)函数

遍历整个stack,找到返回位置,找不到返回-1。

  1. template<typename T>
  2. size_t KStack<T>::search(T val)
  3. {
  4. for (int i = 0; i < size(); i++)
  5. {
  6. if (m_begin[i] == val)
  7. {
  8. return size() - i;
  9. }
  10. }
  11. return -1;
  12. }

size_t size()函数

容量末尾指针与元素开始指针相减。

  1. template<typename T>
  2. size_t KStack<T>::size()
  3. {
  4. return m_end - m_begin;
  5. }

void reserve(size_t n)函数

如果开辟空间小于当前空间,忽略。开辟N容量的新数组,复制原数组到新数组,删除原数组,偏移三个指针。

  1. template<typename T>
  2. void KStack<T>::reserve(size_t n)
  3. {
  4. size_t oldsize = size();
  5. if (n <= m_storagetail - m_begin)
  6. {
  7. return;
  8. }
  9. else
  10. {
  11. T* newsize = new T[n];
  12. memcpy(newsize, m_begin, sizeof(T) * size());
  13. delete[] m_begin;
  14. m_begin = newsize;
  15. m_end = m_begin + oldsize;
  16. m_storagetail = m_begin + n;
  17. }
  18. }

iterator begin()const函数

返回开始指针

  1. template<typename T>
  2. typename KStack<T>::iterator KStack<T>::begin()const
  3. {
  4. return m_begin;
  5. }

iterator end()const函数

返回元素末尾指针

  1. template<typename T>
  2. typename KStack<T>::iterator KStack<T>::end()const
  3. {
  4. return m_end;
  5. }

list容器实现

采用双向循环链表实现,定义listnode

  1. template<typename T>
  2. class KListNode
  3. {
  4. public:
  5. KListNode(T value, KListNode* prenode, KListNode* nextnode) :m_value(value), m_pre(prenode), m_next(nextnode)
  6. {
  7. }
  8. T m_value;
  9. KListNode* m_pre;
  10. KListNode* m_next;
  11. };//双向链表

初始化KListNode m_head指针、KListNode m_tail指针。

vector实现了如下函数

  1. template <typename T>
  2. class KList
  3. {
  4. public:
  5. KList();
  6. ~KList();
  7. void push_front(const T& val);
  8. void push_back(const T& val);
  9. void pop_front();
  10. void pop_back();
  11. void printList();
  12. bool empty();
  13. T back();
  14. T front();
  15. int size();
  16. void sort();
  17. int find(const T& val);
  18. T at(int n);
  19. /*typedef T* iterator;
  20. iterator begin() const;
  21. iterator end() const;*/
  22. private:
  23. KListNode<T>* m_head;
  24. KListNode<T>* m_tail;
  25. int m_size;
  26. };

构造函数

头节点指针,尾节点指针置空初始化。

  1. template <typename T>
  2. KList<T>::KList()
  3. {
  4. m_head = nullptr;
  5. m_tail = nullptr;
  6. }

析构函数

头节点指针,尾节点指针置空并删除。

  1. template <typename T>
  2. KList<T>::~KList()
  3. {
  4. m_head = nullptr;
  5. m_tail = nullptr;
  6. delete m_head;
  7. delete m_tail;
  8. }

void push_front(const T& val)函数

当list为空时:新建头节点,尾节点指向头节点,list的size加一;

当list不为空时:新建节点,新节点的下一个节点指向头节点,头结点的上一个节点指向新节点。新节点的上一个节点指向尾节点,尾节点的下一个结点指向新节点。头节点指针指向新节点,size加一。

  1. template <typename T>
  2. void KList<T>::push_front(const T& val)
  3. {
  4. if (m_head == nullptr)
  5. {
  6. m_head = new KListNode<T>(val, nullptr, nullptr);
  7. m_tail = m_head;
  8. m_size++;
  9. }
  10. else
  11. {
  12. KListNode<T>* ptr = new KListNode<T>(val, nullptr, nullptr);
  13. ptr->m_next = this->m_head;
  14. ptr->m_pre = this->m_tail;
  15. m_tail->m_next = ptr;
  16. m_head->m_pre = ptr;
  17. this->m_head = ptr;
  18. m_size++;
  19. }
  20. }

void push_back(const T& val)函数

当list为空时:新建尾节点,头节点指向尾节点,list的size加一;

当list不为空时:新建节点,新节点的下一个节点指向头节点,头结点的上一个节点指向新节点。新节点的上一个节点指向尾节点,尾节点的下一个结点指向新节点。尾节点指针指向新节点,size加一。

  1. template <typename T>
  2. void KList<T>::push_back(const T& val)
  3. {
  4. if (m_tail == nullptr)
  5. {
  6. m_tail = new KListNode<T>(val, nullptr, nullptr);
  7. m_head = m_tail;
  8. m_size++;
  9. }
  10. else
  11. {
  12. KListNode<T>* ptr = new KListNode<T>(val, nullptr, nullptr);
  13. ptr->m_next = m_head;
  14. m_head->m_pre = ptr;
  15. ptr->m_pre = m_tail;
  16. m_tail->m_next = ptr;
  17. m_tail = ptr;
  18. m_size++;
  19. }
  20. }

void pop_front()函数

尾节点的下一个节点指向头节点的下一个节点,头节点下一个节点的前一个节点指针指向尾节点。删除头节点,新的头节点指针指向尾节点下一个节点,size减一。

  1. template <typename T>
  2. void KList<T>::pop_front()
  3. {
  4. m_tail->m_next = m_head->m_next;
  5. m_head->m_next->m_pre = m_tail;
  6. delete m_head;
  7. m_head = m_tail->m_next;
  8. m_size--;
  9. }

void pop_back()函数

头节点的前一个节点指向尾节点的前一个节点,尾节点的前一个节点的下一个节点指针指向头节点。删除头节点,尾节点指针指向头结点的上一个节点,size减一。

  1. template <typename T>
  2. void KList<T>::pop_back()
  3. {
  4. m_head->m_pre = m_tail->m_pre;
  5. m_tail->m_pre->m_next = m_head;
  6. delete m_tail;
  7. m_tail = m_head->m_pre;
  8. m_size--;
  9. }

void printList()函数

新建ptr指针指向头节点,依据size,循环输出value。

  1. template <typename T>
  2. void KList<T>::printList()
  3. {
  4. if (m_head)
  5. {
  6. KListNode<T>* ptr = m_head;
  7. int count = 0;
  8. while (m_size != count)
  9. {
  10. std::cout << ptr->m_value << " ";
  11. ptr = ptr->m_next;
  12. count++;
  13. }
  14. std::cout << std::endl;
  15. }
  16. else
  17. {
  18. return;
  19. }
  20. }

bool empty()函数

判断头节点是否等于尾节点

  1. template <typename T>
  2. bool KList<T>::empty()
  3. {
  4. return (m_head == m_tail);
  5. }

T back()函数

返回尾节点的value

  1. template <typename T>
  2. T KList<T>::back()
  3. {
  4. return this->m_tail->m_value;
  5. }

T front()函数

返回头节点的value

  1. template <typename T>
  2. T KList<T>::front()
  3. {
  4. return this->m_head->m_value;
  5. }

int size()函数

返回m_size。

  1. template <typename T>
  2. int KList<T>::size()
  3. {
  4. return this->m_size;
  5. }

void sort()函数

快排思想排序

  1. template <typename T>
  2. void KList<T>::sort()
  3. {
  4. if (m_size > 1)
  5. {
  6. int i = 1;
  7. int j = 0;
  8. KListNode<T>* ptr = m_head;
  9. while (m_size != i)
  10. {
  11. j = 0;
  12. KListNode<T>* temp = ptr;
  13. while (j != m_size - i)
  14. {
  15. if (ptr->m_value > temp->m_next->m_value)
  16. {
  17. ptr->m_value += temp->m_next->m_value;
  18. temp->m_next->m_value = ptr->m_value - temp->m_next->m_value;
  19. ptr->m_value -= temp->m_next->m_value;
  20. }
  21. temp = temp->m_next;
  22. j++;
  23. }
  24. ptr = ptr->m_next;
  25. i++;
  26. }
  27. }
  28. }

int find(const T& val)函数

遍历list

  1. template <typename T>
  2. int KList<T>::find(const T& val)
  3. {
  4. KListNode<T>* ptr = m_head;
  5. for (int count = 0; count <= m_size; count++)
  6. {
  7. if (ptr == nullptr)
  8. {
  9. return -1;
  10. }
  11. if(ptr->m_value == val && ptr != nullptr)
  12. {
  13. return count;
  14. }
  15. ptr = ptr->m_next;
  16. }
  17. return -1;
  18. }

T at(int n)函数

遍历list

  1. template <typename T>
  2. T KList<T>::at(int n)
  3. {
  4. if (n <= m_size)
  5. {
  6. KListNode<T>* ptr = m_head;
  7. for (int i = 0; i < n; i++)
  8. {
  9. ptr = ptr->m_next;
  10. }
  11. return ptr->m_value;
  12. }
  13. return -1;
  14. }

map容器实现

我的map使用了改造的双向循环链表(superlistnode),每个节点同时具有K类型的key和V类型的val。

  1. template<typename K, typename V>
  2. class KSuperListNode
  3. {
  4. public:
  5. KSuperListNode(K key, V value, KSuperListNode* prenode, KSuperListNode* nextnode)
  6. :m_key(key)
  7. , m_value(value)
  8. , m_pre(prenode)
  9. , m_next(nextnode)
  10. {
  11. }
  12. K m_key;
  13. V m_value;
  14. KSuperListNode* m_pre;
  15. KSuperListNode* m_next;
  16. };//改造双向链表

map容器实现了以下函数:

  1. template<typename K, typename V>
  2. class KMap
  3. {
  4. public:
  5. KMap();
  6. ~KMap();
  7. void insert(K key, V val);
  8. void printMap();
  9. int size();
  10. V at(K key);
  11. bool empty();
  12. void clear();
  13. void erase(K key);
  14. private:
  15. void sort();
  16. KSuperListNode<K, V>* m_head;
  17. KSuperListNode<K, V>* m_tail;
  18. int m_size = 0;
  19. };

初始化KSuperListNode m_head指针、KSuperListNode m_tail指针。

构造函数

初始化头指针,尾指针

  1. template<typename K, typename V>
  2. KMap<K, V>::KMap()
  3. {
  4. m_head = nullptr;
  5. m_tail = nullptr;
  6. }

析构函数

调用clear()

  1. template<typename K, typename V>
  2. KMap<K, V>::~KMap()
  3. {
  4. clear();
  5. }

void sort()私有函数

快排,依据key值进行大小排序,key值移动的同时,移动value值。

  1. template<typename K, typename V>
  2. void KMap<K, V>::sort()
  3. {
  4. if (m_size > 1)
  5. {
  6. int i = 1;
  7. int j = 0;
  8. KSuperListNode<K, V>* ptr = m_head;
  9. while (m_size != i)
  10. {
  11. j = 0;
  12. KSuperListNode<K, V>* temp = ptr;
  13. while (j != m_size - i)
  14. {
  15. if (ptr->m_key > temp->m_next->m_key)
  16. {
  17. ptr->m_key += temp->m_next->m_key;
  18. ptr->m_value += temp->m_next->m_value;
  19. temp->m_next->m_key = ptr->m_key - temp->m_next->m_key;
  20. temp->m_next->m_value = ptr->m_value - temp->m_next->m_value;
  21. ptr->m_key -= temp->m_next->m_key;
  22. ptr->m_value -= temp->m_next->m_value;
  23. }
  24. temp = temp->m_next;
  25. j++;
  26. }
  27. ptr = ptr->m_next;
  28. i++;
  29. }
  30. }
  31. }

void insert(K key, V val)函数

当map为空时:新建节点,头节点、尾节点指向新节点,size加一。

当map不为空时:新建节点,新节点的下一个节点指向头节点,头节点的上一个节点指向新节点。尾节点的下一个节点指向新节点,新节点的上一个指针指向尾节点。size加一,整个map排序。

  1. template<typename K, typename V>
  2. void KMap<K, V>::insert(K key, V val)
  3. {
  4. if (m_tail == nullptr)
  5. {
  6. m_tail = new KSuperListNode<K, V>(key, val, nullptr, nullptr);
  7. m_head = m_tail;
  8. m_size++;
  9. }
  10. else
  11. {
  12. KSuperListNode<K, V>* ptr = new KSuperListNode<K, V>(key, val, nullptr, nullptr);
  13. ptr->m_next = m_head;
  14. m_head->m_pre = ptr;
  15. ptr->m_pre = m_tail;
  16. m_tail->m_next = ptr;
  17. m_tail = ptr;
  18. m_size++;
  19. sort();
  20. }
  21. }

void printMap()函数

依据size遍历整个map

  1. template<typename K, typename V>
  2. void KMap<K, V>::printMap()
  3. {
  4. if (m_head)
  5. {
  6. KSuperListNode<K, V>* ptr = m_head;
  7. int count = 0;
  8. while (m_size != count)
  9. {
  10. std::cout << "key: " << ptr->m_key << " value: " << ptr->m_value << std::endl;
  11. ptr = ptr->m_next;
  12. count++;
  13. }
  14. std::cout << std::endl;
  15. }
  16. else
  17. {
  18. return;
  19. }
  20. }

int size()函数

返回size

  1. template<typename K, typename V>
  2. int KMap<K, V>::size()
  3. {
  4. return m_size;
  5. }

V at(K key)函数

遍历查找key,输出key对应的value。

  1. template<typename K, typename V>
  2. V KMap<K, V>::at(K key)
  3. {
  4. if (m_head)
  5. {
  6. KSuperListNode<K, V>* ptr = m_head;
  7. int count = 0;
  8. while (m_size != count)
  9. {
  10. if (ptr->m_key == key)
  11. {
  12. return ptr->m_value;
  13. }
  14. ptr = ptr->m_next;
  15. count++;
  16. }
  17. }
  18. return 0;
  19. }

bool empty()函数

判断size

  1. template<typename K, typename V>
  2. bool KMap<K, V>::empty()
  3. {
  4. if (m_size == 0)
  5. {
  6. return true;
  7. }
  8. return false;
  9. }

void clear()函数

头尾指针置空并删除。

  1. template<typename K, typename V>
  2. void KMap<K, V>::clear()
  3. {
  4. m_head = nullptr;
  5. m_tail = nullptr;
  6. delete m_head;
  7. delete m_tail;
  8. m_size = 0;
  9. }

void erase(K key)函数

遍历查询key,删除key位置的节点,连接key前后两个节点。

  1. template<typename K, typename V>
  2. void KMap<K, V>::erase(K key)
  3. {
  4. if (m_head)
  5. {
  6. KSuperListNode<K, V>* ptr = m_head;
  7. int count = 0;
  8. while (m_size != count)
  9. {
  10. if (ptr->m_key == key)
  11. {
  12. KSuperListNode<K, V>* ptrnext = ptr->m_next;
  13. ptr->m_pre->m_next = ptrnext;
  14. ptrnext->m_pre = ptr->m_pre;
  15. delete ptr;
  16. m_size--;
  17. break;
  18. }
  19. ptr = ptr->m_next;
  20. count++;
  21. }
  22. }
  23. }

set容器实现

set容器基于我写的list容器实现。

set实现以下函数:

  1. #include"klist.hpp"
  2. template<typename T>
  3. class KSet
  4. {
  5. public:
  6. KSet();
  7. ~KSet();
  8. void insert(T value);
  9. void printSet();
  10. int find(T val);
  11. int size();
  12. private:
  13. KList<T> list;
  14. int m_size = 0;
  15. };

构造函数

  1. template<typename T>
  2. KSet<T>::KSet()
  3. {
  4. KList<T> list;
  5. }

析构函数

  1. template<typename T>
  2. KSet<T>::~KSet()
  3. {
  4. list.~KList();
  5. }

void insert(T value)函数

insert函数先判断set容器内是否含有该元素,若没有,插入该元素并排序。

  1. template<typename T>
  2. void KSet<T>::insert(T value)
  3. {
  4. if (list.size() >= 0)
  5. {
  6. if (list.find(value) == -1)
  7. {
  8. list.push_back(value);
  9. list.sort();
  10. }
  11. }
  12. }

void printSet()函数

  1. template<typename T>
  2. void KSet<T>::printSet()
  3. {
  4. list.printList();
  5. }

int find(T val)函数

  1. template<typename T>
  2. int KSet<T>::find(T val)
  3. {
  4. return list.find(val);
  5. }

int size()函数

  1. template<typename T>
  2. int KSet<T>::size()
  3. {
  4. return list.size();
  5. }

deque容器实现

deque容器基于我写的list容器实现。

deque实现了以下函数:

  1. #include<iostream>
  2. #include"klist.hpp"
  3. template<typename T>
  4. class KDeque
  5. {
  6. public:
  7. KDeque();
  8. ~KDeque();
  9. void push_back(T val);
  10. void push_front(T val);
  11. void pop_back();
  12. void pop_front();
  13. T front();
  14. T back();
  15. T at(int n);
  16. void ptintDEqueue();
  17. bool empty();
  18. int size();
  19. void sort();
  20. int find(const T& val);
  21. private:
  22. KList<T> list;
  23. };

构造函数

  1. template<typename T>
  2. KDeque<T>::KDeque()
  3. {
  4. KList<T> list;
  5. }

析构函数

  1. template<typename T>
  2. KDeque<T>::~KDeque()
  3. {
  4. list.~KList();
  5. }

void push_back(T val)函数

  1. template<typename T>
  2. void KDeque<T>::push_back(T val)
  3. {
  4. list.push_back(val);
  5. }

void push_front(T val)函数

  1. template<typename T>
  2. void KDeque<T>::push_front(T val)
  3. {
  4. list.push_front(val);
  5. }

void pop_back()函数

  1. template<typename T>
  2. void KDeque<T>::pop_back()
  3. {
  4. list.pop_back();
  5. }

void pop_front()函数

  1. template<typename T>
  2. void KDeque<T>::pop_front()
  3. {
  4. list.pop_front();
  5. }

T front()函数

  1. emplate<typename T>
  2. T KDeque<T>::front()
  3. {
  4. return list.front();
  5. }

T back()函数

  1. template<typename T>
  2. T KDeque<T>::back()
  3. {
  4. return list.back();
  5. }

T at(int n)函数

  1. template<typename T>
  2. T KDeque<T>::at(int n)
  3. {
  4. return list.at(n);
  5. }

void ptintDEqueue()函数

  1. template<typename T>
  2. void KDeque<T>::ptintDEqueue()
  3. {
  4. list.printList();
  5. }

bool empty()函数

  1. template<typename T>
  2. bool KDeque<T>::empty()
  3. {
  4. return list.empty();
  5. }

int size()函数

  1. template<typename T>
  2. int KDeque<T>::size()
  3. {
  4. return list.size();
  5. }

void sort()函数

  1. template<typename T>
  2. void KDeque<T>::sort()
  3. {
  4. list.sort();
  5. }

int find(const T& val)函数

  1. template<typename T>
  2. int KDeque<T>::find(const T& val)
  3. {
  4. return list.find(val);
  5. }

queue容器实现

queue容器基于我写的list容器实现。

queue实现了以下函数:

  1. #include<iostream>
  2. #include"klist.hpp"
  3. template<typename T>
  4. class KQueue
  5. {
  6. public:
  7. KQueue();
  8. ~KQueue();
  9. void push(T val);
  10. void pop();
  11. bool empty();
  12. T front();
  13. T back();
  14. int size();
  15. void printqueue();
  16. void sort();
  17. int find(const T& val);
  18. T at(int n);
  19. private:
  20. KList<T> list;
  21. };

构造函数

  1. template<typename T>
  2. KQueue<T>::KQueue()
  3. {
  4. KList<T> list;
  5. }

析构函数

  1. template<typename T>
  2. KQueue<T>::~KQueue()
  3. {
  4. list.~KList();
  5. }

void push(T val)函数

  1. template<typename T>
  2. void KQueue<T>::push(T val)
  3. {
  4. list.push_back(val);
  5. }

void pop()函数

  1. template<typename T>
  2. void KQueue<T>::pop()
  3. {
  4. list.pop_front();
  5. }

bool empty()函数

  1. bool KQueue<T>::empty()
  2. {
  3. return list.empty();
  4. }

T front()函数

  1. template<typename T>
  2. T KQueue<T>::front()
  3. {
  4. return list.front();
  5. }

T back()函数

  1. template<typename T>
  2. T KQueue<T>::back()
  3. {
  4. return list.back();
  5. }

int size()函数

  1. template<typename T>
  2. int KQueue<T>::size()
  3. {
  4. return list.size();
  5. }

void printqueue()函数

  1. template<typename T>
  2. void KQueue<T>::printqueue()
  3. {
  4. list.printList();
  5. }

void sort()函数

  1. template<typename T>
  2. void KQueue<T>::sort()
  3. {
  4. list.sort();
  5. }

int find(const T& val)函数

  1. template<typename T>
  2. int KQueue<T>::find(const T& val)
  3. {
  4. return list.find(val);
  5. }

T at(int n)函数

  1. template <typename T>
  2. T KQueue<T>::at(int n)
  3. {
  4. return list.at(n);
  5. }