鱼C论坛

 找回密码
 立即注册
查看: 1823|回复: 3

[技术交流] 如何实现一个动态顺序线性表(手动打造vector)

[复制链接]
发表于 2019-11-21 10:00:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、简介
        相信学c++的小伙伴们都知道c++的库里有一个特别好用的动态数组Vector吧,但是各位小伙伴知道怎么实现的么?
        这里我就带大家手动打造一个自己的vector,话不多说,上代码(注释很详细哦)
二、代码
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. template <typename T>
  4. class CList {
  5. public:
  6.         //初始化线性表,空间大小为10
  7.         void Init()
  8.         {
  9.                 m_nLength = 0;
  10.                 m_nSize = 10;
  11.                 m_List = (T*)malloc(m_nSize * sizeof(T));
  12.         }
  13.         //在指定位置插入元素
  14.         bool Insert(unsigned int nIndex, const T& elem)
  15.         {
  16.                 //如果插入元素的地址无法访问,则插入失败
  17.                 if (nIndex<0 || nIndex>m_nLength)
  18.                         return false;
  19.                 //判断插入元素后是否需要重新分配内存
  20.                 if (m_nSize < m_nLength + 1)
  21.                 {
  22.                         m_List = (T*)realloc(m_List, m_nSize * sizeof(T) * 2);
  23.                         if (m_List == NULL)
  24.                                 return false;
  25.                         m_nSize *= 2;
  26.                 }
  27.                 //进行插入操作
  28.                 for (int i = m_nLength; i > nIndex; i--)
  29.                 {
  30.                         m_List[i] = m_List[i - 1];
  31.                 }
  32.                 m_List[nIndex] = elem;
  33.                 m_nLength++;
  34.                 return true;
  35.         }
  36.         //在指定位置插入n个相同的元素
  37.         bool Insert(unsigned int nPos, unsigned int nNum, const T& elem)
  38.         {
  39.                 //如果插入元素的地址无法访问,则插入失败
  40.                 if (nPos<0 || nPos>m_nLength)
  41.                         return false;
  42.                 //判断插入元素后是否需要重新分配内存
  43.                 if (m_nSize < m_nLength + nNum)
  44.                 {
  45.                         m_List = (T*)realloc(m_List, m_nSize * sizeof(T) * 2);
  46.                         if (m_List == NULL)
  47.                                 return false;
  48.                         m_nSize *= 2;
  49.                 }
  50.                 //开始插入元素
  51.                 //从后往前移位
  52.                 for (int i = m_nLength + nNum - 1; i >= (nPos + nNum); i--)
  53.                 {
  54.                         m_List[i] = m_List[i - nNum];
  55.                 }
  56.                 m_nLength += nNum;
  57.                 //放入元素
  58.                 while (nNum--)
  59.                 {
  60.                         m_List[nPos++] = elem;
  61.                 }
  62.                 return true;
  63.         }
  64.         //在指定位置删除元素
  65.         bool Remove(unsigned int nIndex)
  66.         {
  67.                 //如果删除元素的地址无法访问,则删除失败
  68.                 if (nIndex<0 || nIndex>m_nLength)
  69.                         return false;
  70.                 //开始删除元素
  71.                 m_nLength--;
  72.                 for (int i = nIndex; i < m_nLength; i++)
  73.                 {
  74.                         m_List[i] = m_List[i + 1];
  75.                 }
  76.                 return true;
  77.         }
  78.         //重载下标运算符,使其可以直接修改元素
  79.         T& operator[](unsigned int nIndex)
  80.         {
  81.                 //如果元素的地址无法访问,则输出错误信息
  82.                 if (nIndex < 0 || nIndex >= m_nLength)
  83.                         printf("访问越界\n");
  84.                 return m_List[nIndex];
  85.         }
  86.         //查找元素
  87.         int SearchElem(const T& elem)
  88.         {
  89.                 int nIndex = 0;
  90.                 while (nIndex < m_nLength)
  91.                 {
  92.                         if (m_List[nIndex] == elem)
  93.                                 break;
  94.                         nIndex++;
  95.                 }
  96.                 //没有找到
  97.                 if (nIndex == m_nLength)
  98.                         nIndex = -1;
  99.                 return nIndex;
  100.         }
  101.         //返回当前长度
  102.         int GetLength()
  103.         {
  104.                 return m_nLength;
  105.         }
  106.         //清空线性表
  107.         void Clear()
  108.         {
  109.                 memset(m_List, 0, m_nSize*(sizeof(T)));
  110.                 m_nLength = 0;
  111.         }
  112.         //线性表元素入栈
  113.         void push_back(const T& elem)
  114.         {
  115.                 //判断插入元素后是否需要重新分配内存
  116.                 if (m_nSize < m_nLength + 1)
  117.                 {
  118.                         m_List = (T*)realloc(m_List, m_nSize * sizeof(T) * 2);
  119.                         if (m_List == NULL)
  120.                                 return;
  121.                         m_nSize *= 2;
  122.                 }
  123.                 m_List[m_nLength] = elem;
  124.                 m_nLength++;
  125.         }
  126.         //线性表尾部元素出栈
  127.         T& pop_back()
  128.         {
  129.                 m_nLength--;
  130.                 return m_List[m_nLength];
  131.         }
  132.         //返回某一位置的元素
  133.         T at(unsigned int nIndex)
  134.         {
  135.                 return m_List[nIndex];
  136.         }
  137. private:
  138.         T* m_List;
  139.         int m_nLength;
  140.         int m_nSize;
  141. };

  142. int main()
  143. {
  144.         CList<int> objList;
  145.         objList.Init();
  146.         for (int i = 0; i < 10; i++)
  147.                 objList.push_back(i);
  148.         for (int i = 0; i < 10; i++)
  149.                 printf("%3d", objList[i]);
  150.         printf("\n");
  151.         objList.Insert(9, 5, 11);
  152.         for (int i = 0; i < 15; i++)
  153.                 printf("%3d", objList[i]);
  154.         printf("\n");
  155.         while (objList.GetLength() != 0)
  156.         {
  157.                 printf("%3d", objList.pop_back());
  158.         }
  159.         printf("\n");
  160.         return 0;
  161. }
复制代码

三、结束语
        嗯,可能还有一些小bug,但是大致功能实现了,欢迎各位大佬指正
        也希望和各位小伙伴们交流学习,共同进步
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-11-21 10:01:16 | 显示全部楼层
唉,之前的帖子被吃掉了,好难受,这篇是补发的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-21 18:21:01 | 显示全部楼层
顶一顶
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-21 19:42:25 | 显示全部楼层
再来个析构函数就完美了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-1 19:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表