托管网站服务器,企业建设网站的步骤是什么,网站备案账户名如何查询,重庆专业做淘宝网站1. list的介绍及使用
1.1 list的介绍
1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器#xff0c;并且该容器可以前后双向迭代。
2.list的底层是双向链表结构#xff0c;双向链表中每个元素存储在互不相关的独立节点中#xff0c;在节点中通过指针指向其前…1. list的介绍及使用
1.1 list的介绍
1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器并且该容器可以前后双向迭代。
2.list的底层是双向链表结构双向链表中每个元素存储在互不相关的独立节点中在节点中通过指针指向其前一个元素和后一个元素。
3.list与forward_list非常相似最主要的不同在于forward_list是单链表只能朝前迭代让其更简单高效。
4.与其他的序列式容器相比array_vectordequelist通常在任意位置进行插入、移除元素的执行效率更好。
5.与其他序列式容器相比list和forward_list最大的缺陷是不支持任意位置的随机访问比如要访问list的第六个元素必须从已知的位置比如头部或尾部迭代到该位置在这段位置上迭代器需要线性的时间开销list还需要一些额外的空间以保存每个节点的相关联信息。 1.2 list的使用
1.2.1 list的构造 析构函数constructor 接口说明 list (size_type n, const value_type val value_type())构造的list中包含n个值为val的元素list()构造空的listlist (const list x)拷贝构造函数list (InputIterator first, InputIterator last)用[first, last)区间中的元素构造list
若为手机阅读表格可左右移动 1.2.2 list iterato的使用
此处大家可暂时将迭代器理解成一个指针该指针指向list中的某个节点。 函数声明 接口说明 beginend返回第一个元素的迭代器返回最后一个元素下一个位置的迭代器rbeginrend返回第一个元素的reverse_iterator即end位置返回最后一个元素下一个位置的reverse_iterator即beign位置 若为手机阅读表格可左右移动 【注意】 1. begin与end为正向迭代器对迭代器执行操作迭代器向后移动 2. rbegin(end)与rend(begin)为反向迭代器对迭代器执行操作迭代器向前移动 1.2.3 list capacity 函数声明 接口说明 empty检测list是否为空是返回true否则返回falsesize返回list中有效节点的个数 若为手机阅读表格可左右移动 1.2.4 list element access 函数声明 接口说明 front返回list的第一个节点中值的引用back返回list的最后一个节点中值的引用 若为手机阅读表格可左右移动 1.2.5 list modifiers 函数声明 接口说明 push_front在list首元素前插入值为val的元素pop_front删除list中的第一个元素push_back在list尾部插入值为val的元素pop_back删除list中最后一个元素insert在list position位置中插入值为val的元素erase删除list position位置的元素swap交换两个list中的元素clear清空list中的有效元素
若为手机阅读表格可左右移动 1.2.6 list的迭代器失效 前面说过此处大家可将迭代器暂时理解成类似于指针迭代器失效即迭代器所指向的节点的无效即该节点被删除了。因为list的底层结构为带头结点的双向循环链表因此在list中进行插入时是不会导致list的迭代器失效的只有在删除时才会失效并且失效的只是指向被删除节点的迭代器其他迭代器不会受到影响。
错误 改正 2. list的模拟实现 实现节点类 templateclass T
struct ListNode
{ListNodeT* _next;ListNodeT* _prev;T _data;ListNode(const T data T()):_next(nullptr), _prev(nullptr), _data(data){}
}; 实现正向迭代器 迭代器不用实现析构函数和深拷贝。因为迭代器本身就是为了访问链表的节点节点属于链表不属于迭代器如果需要析构和深拷贝应该在控制链表的类中实现。 templateclass T, class Ref, class Ptrstruct ListIterator{typedef ListNodeT Node;typedef ListIteratorT, Ref, Ptr self;Node* _node;ListIterator(Node* node):_node(node){}self operator(){_node _node-_next;return *this;}self operator(int){self tmp(*this);_node _node-_next;return tmp;}self operator--(){_node _node-_prev;return *this;}self operator--(int){self tmp(*this);_node _node-_prev;return tmp;}Ref operator*(){return _node-_data;}bool operator!(const self it){return _node ! it._node;}bool operator(const self it){return _node it._node;}Ptr operator-(){return _node-_data;}}; 实现反向迭代器 templateclass T, class Ref, class Ptr
struct RListIterator
{typedef ListNodeT Node;typedef RListIteratorT, Ref, Ptr self;Node* _node;RListIterator(Node* node):_node(node){}self operator(){_node _node-_prev;return *this;}self operator(int){self tmp(*this);_node _node-_prev;return tmp;}self operator--(){_node _node-_next;return *this;}self operator--(int){self tmp(*this);_node _node-_next;return tmp;}Ref operator*(){return _node-_data;}bool operator!(const self it){return _node ! it._node;}bool operator(const self it){return _node it._node;}Ptr operator-(){return _node-_data;}
}; 实现控制list的类 templateclass T
class list
{typedef ListNodeT Node;public:typedef ListIteratorT, T, T* iterator;typedef RListIteratorT, T, T* reverse_iterator;typedef ListIteratorT, const T, const T* const_iterator;void empty_init(){_head new Node();_head-_next _head;_head-_prev _head;}list(){empty_init();}list(const listT it){empty_init();for (const auto e : it) //在范围for上加上引用如果it内的元素体积很大的话可以减小代价引用并不会导致浅拷贝//eg:int a1;int a1a;int ba1;变量b只是和a的值一样并没有指向同一块空间int ba;{push_back(e);}}list(initializer_listT il){empty_init();for (const auto e : il){push_back(e);}}~list(){clear();delete _head;_head nullptr;}void clear(){auto it begin();while (it ! end()){it erase(it);}}listT operator(listT it){std::swap(_head, it._head);return *this;}iterator begin(){return iterator(_head-_next);}const_iterator begin() const{return const_iterator(_head-_next);}iterator end(){return iterator(_head);}const_iterator end() const{return const_iterator(_head);}reverse_iterator rbegin(){return reverse_iterator(_head-_prev);}reverse_iterator rend(){return reverse_iterator(_head);}void push_back(const T x){//Node* newnode new Node(x);//Node* tail _head-_prev;//tail-_next newnode;//newnode-_prev tail;//newnode-_next _head;//_head-_prev newnode;insert(end(), x);}void pop_back(){erase(--end());}void push_front(const T x){insert(begin(), x);}void pop_front(){erase(begin());}iterator insert(iterator pos, const T x){Node* cur pos._node;Node* newnode new Node(x);Node* prev cur-_prev;prev-_next newnode;newnode-_prev prev;newnode-_next cur;cur-_prev newnode;return iterator(newnode);}iterator erase(iterator pos){assert(pos ! end());Node* cur pos._node;Node* prev cur-_prev;Node* next cur-_next;prev-_next next;next-_prev prev;delete cur;return iterator(next);}private:Node* _head;
}; 完整list.h
#pragma once
#include assert.h
namespace wmm
{templateclass Tstruct ListNode{ListNodeT* _next;ListNodeT* _prev;T _data;ListNode(const T data T()):_next(nullptr), _prev(nullptr), _data(data){}};templateclass T, class Ref, class Ptrstruct RListIterator{typedef ListNodeT Node;typedef RListIteratorT, Ref, Ptr self;Node* _node;RListIterator(Node* node):_node(node){}self operator(){_node _node-_prev;return *this;}self operator(int){self tmp(*this);_node _node-_prev;return tmp;}self operator--(){_node _node-_next;return *this;}self operator--(int){self tmp(*this);_node _node-_next;return tmp;}Ref operator*(){return _node-_data;}bool operator!(const self it){return _node ! it._node;}bool operator(const self it){return _node it._node;}Ptr operator-(){return _node-_data;}};templateclass T, class Ref, class Ptrstruct ListIterator{typedef ListNodeT Node;typedef ListIteratorT, Ref, Ptr self;Node* _node;ListIterator(Node* node):_node(node){}self operator(){_node _node-_next;return *this;}self operator(int){self tmp(*this);_node _node-_next;return tmp;}self operator--(){_node _node-_prev;return *this;}self operator--(int){self tmp(*this);_node _node-_prev;return tmp;}Ref operator*(){return _node-_data;}bool operator!(const self it){return _node ! it._node;}bool operator(const self it){return _node it._node;}Ptr operator-(){return _node-_data;}};templateclass Tclass list{typedef ListNodeT Node;public:typedef ListIteratorT, T, T* iterator;typedef RListIteratorT, T, T* reverse_iterator;typedef ListIteratorT, const T, const T* const_iterator;void empty_init(){_head new Node();_head-_next _head;_head-_prev _head;}list(){empty_init();}list(const listT it){empty_init();for (const auto e : it) //在范围for上加上引用如果it内的元素体积很大的话可以减小代价引用并不会导致浅拷贝//eg:int a1;int a1a;int ba1;变量b只是和a的值一样并没有指向同一块空间int ba;{push_back(e);}}list(initializer_listT il){empty_init();for (const auto e : il){push_back(e);}}~list(){clear();delete _head;_head nullptr;}void clear(){auto it begin();while (it ! end()){it erase(it);}}listT operator(listT it){std::swap(_head, it._head);return *this;}iterator begin(){return iterator(_head-_next);}const_iterator begin() const{return const_iterator(_head-_next);}iterator end(){return iterator(_head);}const_iterator end() const{return const_iterator(_head);}reverse_iterator rbegin(){return reverse_iterator(_head-_prev);}reverse_iterator rend(){return reverse_iterator(_head);}void push_back(const T x){//Node* newnode new Node(x);//Node* tail _head-_prev;//tail-_next newnode;//newnode-_prev tail;//newnode-_next _head;//_head-_prev newnode;insert(end(), x);}void pop_back(){erase(--end());}void push_front(const T x){insert(begin(), x);}void pop_front(){erase(begin());}iterator insert(iterator pos, const T x){Node* cur pos._node;Node* newnode new Node(x);Node* prev cur-_prev;prev-_next newnode;newnode-_prev prev;newnode-_next cur;cur-_prev newnode;return iterator(newnode);}iterator erase(iterator pos){assert(pos ! end());Node* cur pos._node;Node* prev cur-_prev;Node* next cur-_next;prev-_next next;next-_prev prev;delete cur;return iterator(next);}private:Node* _head;};//遍历测试void test(){listint l;l.push_back(1);l.push_back(2);l.push_back(3);l.push_back(4);listint::iterator it l.begin();while (it ! l.end()){cout *it endl;it;}}//结构体数据重载符号-测试struct pos{int _x;int _y;pos(int x 0, int y 0):_x(x), _y(y){}};void test2(){listpos l;struct pos* a (struct pos*)malloc(sizeof(struct pos));a-_x 200;a-_y 200;struct pos b;b._x 300;b._y 300;l.push_back(pos(100, 100));l.push_back(*a);l.push_back(b);listpos::iterator it l.begin();while (it ! l.end()){cout (*it)._x endl;cout (*it)._y endl;cout it._node-_data._x endl;cout it._node-_data._y endl;cout it-_x endl;cout it-_y endl;//想让迭代器it像结构体指针一样访问数据重载了一个-符号it;}}//erase insert 测试void test3(){listint l;l.push_back(1);l.push_back(2);l.push_back(3);l.push_back(4);listint::iterator it l.begin();itl.erase(it);//注意迭代器失效问题for (auto e : l){cout e endl;}cout endl;//itl.begin();l.insert(it, 1);for (auto e : l){cout e endl;e 3;}}//拷贝构造测试void test4(){listint l;l.push_back(1);l.push_back(2);l.push_back(3);l.push_back(4);for (auto e : l){cout e endl;}cout endl;listint l1(l);for (auto e : l1){cout e endl;}cout endl;listint::iterator it l1.begin();*it 0;for (auto e : l){cout e endl;}cout endl;for (auto e : l1){cout e endl;}cout endl;}//operator测试void test5(){listint l({ 1,2,3,4,5 });listint l1 { 1,2,3,4,6 };l1 l;for (const auto e : l){cout e endl;}cout endl;for (const auto e : l1){cout e endl;}cout endl;listint::iterator it l1.begin();*it 0;for (const auto e : l){cout e endl;}cout endl;for (const auto e : l1){cout e endl;}cout endl;}//反向迭代器测试void test6(){listint l({ 1,2,3,4,5 });listint::iterator it l.begin();while (it ! l.end()){cout *it endl;it;}listint l2({ 1,2,3,4,5 });listint::reverse_iterator it1 l2.rbegin();while (it1 ! l2.rend()){cout *it1 endl;it1;}}
}
3. list与vector的对比
vector与list都是STL中非常重要的序列式容器由于两个容器的底层结构不同导致其特性以及应用场景不 同其主要不同如下 下次再见~~很高兴帮助到你~~
如果有问题欢迎指正批评~~