浅谈STL list<T>链表容器和迭代器的使用C++实现
来源:互联网 发布:软件系统关键技术指标 编辑:程序博客网 时间:2024/05/22 17:27
一、今天简单的实现了STL容器里面的顺序容器list双链表里面的简单应用和迭代器的简单实现方法
包括迭代器的重载方法
二、双向链表的实现需要了解 堆得内存分配问题。堆内存是开发者使用new开辟的空间 需要开发者自己释放掉内存 否者将会存在内存中知道程序结束
所以对内存的释放很重要。当了解了堆和栈的分配之后将会更加容易理解链表的节点的实现方法。
三、关于栈内存的分配将会在博客中发布
using namespace std;templateclass STL_List{public:STL_List();//list链表指针结构体template struct Nope{ T data;Nope *front; Nope *next; //构造函数 Nope() :data(T()), front(nullptr), next(nullptr) {} Nope(const T &data) :front(nullptr), next(nullptr) { this->data = data; }}; //迭代器类 class Iterator { public: Iterator() {} Iterator(Nope * &p) { head = p; } //复制构造函数 Iterator(Iterator & object) { this->head =object.head ; } //重载前置自增 Iterator operator++() { head = head->next; return *this; } //后置自增 区分前置和后置 后置函数参数列表 多了个(int) Iterator operator++(int) { Iterator temp(*this); head = head->next; return temp; } //重载输出内容friend T operator*(Iterator &it) //重载*用friend { return it.head->data; } friend bool operator!=(Iterator &it, Iterator &it1){if (it.head!= it1.head){return true;}return false;} private: Nope *head; }; //后插void push_back(const T &n_data);//前插void push_front(const T &n_data);//删除指定的值 为空时删除失败 bool remove(T a);//找到返回 trueNope * Search(T a);//返回头结点位置的迭代器对象Iterator begin() { return Iterator(head); } //通过返回Iterator类型 直接调用构造函数//返回尾节点 迭代器对象Iterator end() { return Iterator(tail->next); } //返回节点最后一位的后一个空指针//摧毁链表释放内存bool Destroy();//测试的函数 运用指针的遍历 只适用于编译器内置类型 不能用于自己开发的类和结构体void show(){Nope *p = head;if (p==nullptr)return;while (p){cout << p->data << endl;p = p->next;}}~STL_List();private:Nope *head;Nope *tail;//利用一个简便的函数自己分配 堆内存空间 Nope *&p 形参使用引用 直接修改调用该函数的指针指向位置无需返回值 bool New_n(Nope *&p, const T &data){p = new Nope (data);return true;}};template STL_List ::STL_List(){head = nullptr;tail = nullptr;}template void STL_List ::push_back(const T &n_data){Nope *temp; New_n(temp,n_data); //分配堆空间 //如果链表为空 if (!head) { head = temp; tail = temp; return ; } //不为空时 雷同 push_front(); tail->next = temp; temp->front = tail; tail = temp;return;} template void STL_List ::push_front(const T & n_data) { Nope *temp; New_n(temp, n_data); //如果头结点为空 链表为空 if (nullptr == tail) { head = temp; tail = temp; return; } //链表中有元素时 head->front = temp; //将当前头指针前面指针储存为temp temp->next = head;//将temp的后一个节点(也就是temp->next) 指向头指针 head = temp; //跟新头指针到temp的位置 } template bool STL_List ::remove(T a) { Nope *temp= Search(a); //找到删除的指针 if (temp == head) { head = temp->next; head->front = nullptr; delete temp; return true; } else if (temp == tail) { tail = temp->front; tail->next=nullptr; //重新让为指针next为空 防止打印时检测不到NULL触发异常 delete temp; return true; } else { Nope *p = temp; temp->front->next = temp->next; temp->next->front = temp->front; delete p; return true; } return false; } template typename STL_List ::Nope * STL_List ::Search(T a) //前面加上typename将不会产生错误 因为这样编译器才会将 { //STL_List ::Nope * 认定为类型即 Nope*(结构体指针类型) Nope *p = head; //创建临时变量进行遍历不会影响到 类中私人数据head节点 if (!head) return NULL; //遍历并进行查找 while (p) { if (p->data == a) { return p; // 返回 (Nope*) 结构体指针类型 } p = p->next; } return NULL; } template bool STL_List ::Destroy() { Nope *temp = head; if (!temp) return true; Nope *p = nullptr; //删除节点指针临时变量 while (temp) { p = temp; temp = temp->next; delete p; } if (!temp) { head = nullptr; tail = nullptr; return true; } else return false; }template STL_List ::~STL_List(){Destroy(); //删除自己使用 new 分配的堆空间 释放内存}
下面是测试代码
#include//#include #include "STL_List.h"#include
using namespace std;int main(){STL_List a;STL_List ::Iterator itr;//::表示作用域 表示class Iterator 类在STL_List类里面 是其成员内部类a.push_back(22);a.push_back(33);a.push_back(44);a.push_front(77);a.push_front(88);itr = a.begin();for (; itr != a.end(); ++itr){cout << *itr << endl;}//a.show();//a.remove();system("pause");return 0;}
阅读全文
1 0
- 浅谈STL list<T>链表容器和迭代器的使用C++实现
- STL--> list 双向循环链表容器 接口使用及介绍。 模拟实现 STL list容器
- STL list容器的使用
- STL List容器的使用
- C++STL库list容器简单实现
- 使用STL中的list容器实现单链表的操作
- STL list容器实现集合的交和并
- 表的简单实现——使用C++容器库(STL List)
- STL-list容器使用
- STL容器中list与迭代器iterator的模拟实现
- STL之list容器的实现框架
- C++STL之list双向链表容器
- STL list容器的使用 C++
- STL 中 容器 list 的使用
- STL list型容器的使用
- STL中list的容器使用介绍
- 使用C++STL的map容器实现一种命令映射
- 【C++】vector容器和list容器中使用单个迭代器的erase函数学习笔记
- 线程辅助类(二)--CountDownLatch
- HttpClient通过Post方式发送Json数据
- kotlin学习笔记之环境配置
- 使用DOM、DOM4j、SAX三种方式解析XML
- 大型网站技术架构(七)--网站的可扩展性架构
- 浅谈STL list<T>链表容器和迭代器的使用C++实现
- Linux 常用命令
- 大背包问题(挑战程序设计竞赛)
- 最大连续子序列和的几种解法
- git基本操作(一)
- C语言中如何在工程中单独运行某个源文件
- CSS制作一个商品分类列表,边框是圆角弧度
- 读书笔记-系统分析师-领域
- 大型网站技术架构(八)--网站的安全架构
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
储时扮演者
萝莉储精容器
邮储银行电话
邮储客服
储奶袋
储君之妾
邮储银行装修贷款利率
邮储银行优享贷
储水电热水器
储怎么读
邮储装修贷款能贷多少
尿储留
青储收割机
储奶袋冷冻奶怎么解冻
母亲储精便器第一章
才储八斗
储拼音
中国邮储银行
邮储人工客服电话
傩
傩城
傩戏
傩送
傩舞
阿傩
傩的读音
中国傩城
傩怎么读
阿傩作品
傩文化
傩城在哪里
傩面具
中国傩城景区
傩送的翠翠作品
贵州傩城古镇
中国傩文化
桔乡傩缘
江边傩送作品
傩送饰演者石磊图片
中国傩城门票是多少
贵州傩城有什么玩的