当前位置: 首页 > news >正文

汕头网站安全开发系统傻瓜式做网站哪个软件好

汕头网站安全开发系统,傻瓜式做网站哪个软件好,站点建设方案,只做域名跳转和关停网站从零开始手写STL库–List部分 Github链接:miniSTL 文章目录 从零开始手写STL库–List部分List是什么?List需要包含什么函数1)基础成员函数2)核心功能3)其他功能 基础成员函数的编写核心功能的编写其他功能编写总结 List是什么&am…

从零开始手写STL库–List部分

Github链接:miniSTL


文章目录

  • 从零开始手写STL库–List部分
  • List是什么?
  • List需要包含什么函数
          • 1)基础成员函数
          • 2)核心功能
          • 3)其他功能
  • 基础成员函数的编写
  • 核心功能的编写
  • 其他功能编写
  • 总结


List是什么?

std::list是基于双向链表的的数据结构,与std::vector基于数组不同,list在频繁插入和删除的场景中更适合应用。

List需要包含什么函数

应当具有:

1)基础成员函数

构造函数:初始化List头节点
析构函数:释放内存,当运行结束后要摧毁这个List防止内存泄漏
不同于Vector,List这种以链表为基础的容器一般不需要去拷贝新的List,也就不用手动构建拷贝构造函数和拷贝赋值操作符

2)核心功能

push_back/push_front:在List的末尾/头部加入新元素
pop_back/pop_front:移除List末尾/头部元素
size:获取List长度
clear:清空List
get:获取List中某个元素的值
remove:删除某个节点
find:查找某个值对应的节点
empty:检查List是否为空

3)其他功能

迭代器、重载输出符等等

基础成员函数的编写

List的成员:
List本身是链表,那么每个节点应该包括本节点的数据、指向上/下一个节点的指针,而List是描述这一系列节点构成的双向链表,那么只需要记录头节点、尾节点以及List长度即可

template<typename T>
class myList
{
private:struct Node{T data;Node * next;Node * prev;Node(const T & data_, Node * next_ = nullptr, Node * prev_ = nullptr): data(data_), next(next_), prev(prev_) {} };Node * head;Node * tail;size_t current_size;
public:};

构造函数和析构函数就是

public:myList() : head(nullptr), tail(nullptr), current_size(0) {}~myList() {clear(); }

再次提示,这里的构造函数用current_size(0) 初始化才是合规的,放在中括号内会浪费掉这个初始化进程

析构函数调用一下清空函数即可

核心功能的编写

1、push_back/push_front函数:在List的末尾/头部加入新元素
链表不像动态数组需要考虑分配问题,所以直接加就行了

但是也需要判断List为空的清空,如果为空,head/tail是没法取出next指针的,此时就会报错

所以在push的时候检查一下

(在力扣算法题中避免这种复杂操作的方法是构建一个虚拟头节点,就可以统一处理)

    void push_back(const T & value){Node * temp = new Node(value, nullptr, tail);if(tail) tail->next = temp;else head = temp;tail = temp;current_size ++;}void push_front(const T & value){Node * temp = new Node(value, head, nullptr);if(head) head->prev = temp;else tail = temp;head = temp;current_size ++;}

2、pop_back/pop_front函数:移除List末尾/头部元素
头尾节点的删除较为简单,注意一下空列表的情况特殊处理即可

    void pop_back(){if(current_size > 0){Node * temp = tail->prev;delete tail;tail = temp;if(tail) tail->next = nullptr;else head = nullptr;current_size --;}}void pop_front(){if(current_size > 0){Node * temp = head->next;delete head;head = temp;if(head) head->prev = nullptr;else tail = nullptr;current_size --;}}

这里如果删除之后发现头/尾节点是空了,说明这个List已经空了,但是另一端还没处理,所以要让另一端也为nullptr,否则有可能发生指针越界问题。

3、size函数:获取List长度

    int size(){return current_size;}

4、clear函数:清空List
不同于vector那样直接将size归零,List需要考虑节点占用的内存,所以实际上是需要循环释放的

void clear()    
{        while (head)         {             Node * temp = head;head = head->next;             delete temp;            }         tail = nullptr;         current_size = 0;              
}

5、get函数:获取List中某个元素的值
这里的实现方法不是给定一个get函数,而是重载符号“[]”,这样就能更加方便地访问了

    T &operator[](size_t index){Node * curr = head;for(size_t i = 0; i < index; i ++){if(!curr) throw std::out_of_range("Index out of range!");curr = curr->next;}return curr->data;}const T & operator[](size_t index) const{Node * curr = head;for(size_t i = 0; i < index; i ++){if(!curr) throw std::out_of_range("Index out of range!");curr = curr->next;}return curr->data;}

这里返回值设置为引用是考虑到一下情况

myList testList;
testList[2] = 4;

如果返回的不是引用,那么这样的赋值就会失效,并不能真的修改掉List的节点元素

6、remove函数:删除某个节点
那么这里需要查找到该节点,再进行删除,而且需要注意它是头尾节点时的情况

    void remove(const T & val){Node * temp = head;while (temp && temp->data != val){temp = temp->next;}if(!temp) return;if(temp != head && temp != tail){temp->prev->next = temp->next;temp->next->prev = temp->prev;}else if(temp == head && temp == tail){head = nullptr;tail = nullptr;}else if(temp == head){head = temp->next;head->prev = nullptr;}else{tail = temp->prev;tail->next = nullptr;}current_size --;delete temp;temp = nullptr;}

7、find函数:查找某个值对应的节点
循环遍历对比就行

    Node * getNode(const T & val){Node * node = head;while (node && node->data != val){node = node->next;}return node;}T *find(const T &val){Node * node = getNode(val);if(!node) return nullptr;return & node->data;}

8、empty函数:检查List是否为空

    bool empty(){return current_size == 0;}

其他功能编写

迭代器

    Node * begin() { return head; }Node * end() { return nullptr; }const Node * begin() const { return head; }const Node * end() const { return nullptr; }

重载<<符号

template <typename T>
std::ostream &operator<<(std::ostream &os, myList<T> &pt)
{for (auto current = pt.begin(); current; current = current->next){os << " " << current->data;}os << std::endl;return os;
}

总结

List的编写中,难点在于考虑链表为空的情况,很多个函数都需要去考虑,并且处理头尾节点,实际上是个细致的工作,并不在于思路上有多难。

在经常增删的情况下,用List会比Vector更为合适,代价是内存用得比较多,空间换时间。

http://www.yayakq.cn/news/835207/

相关文章:

  • 南昌城乡住房建设厅网站WordPress老文章提示
  • 怎么做淘宝网站的网页做类似电驴网站
  • 天津企业网站开发免费网页奖励自己游戏网站
  • 创建国际网站网站如何做入支付接口
  • 潍坊学网站建设临沂网站建设对实体企业的重要性
  • 品牌做网站如何熟悉网站项目的逻辑
  • 互动网站设计与制作自己开发游戏需要学什么
  • 百度关键字搜索到自己的网站如何建设学校的微网站
  • 建筑师网站有哪些做打鱼网站需要多少钱
  • 制作微网站的费用成都做个网站
  • wordpress开发教程 pdf网站访问速度优化
  • 网站月流量是什么意思济南建立网站
  • 更换网站首页模板怎么做微信公众平台注册不了
  • 网站公司图片免费高清图片素材网站推荐
  • 上海松江网站制作什么网站可以做棋谱
  • 网站的内部链接如何做网站做营销推广公司
  • 成都网站建设公司开发win10优化大师
  • 白酒网站模板用四字成语做网站域名好吗
  • 门店智能经营平台苏州搜索引擎优化
  • 南海网站智能推广网站界面用什么软件做
  • 微网站的功能wordpress访客明细
  • 网站服务器做缓存空间登录入口
  • 做一个php连接sql网站信阳网站开发建设公司
  • 中国机械加工网官方网站跨境分销平台有哪些
  • 本地怎样做网站河北省唐山市建设规划局的网站
  • 网站建设进什么科目平面设计初中毕业能学吗
  • 百度收录正常网站流量下降这么做网站教程
  • 黄页网站大全通俗易懂wordpress主题错误
  • 哪些网站做推广好微信怎么建立公众号
  • 情侣做记录网站源码想要个免费网站