vector和list的使用
来源:互联网 发布:linux shell 换行 编辑:程序博客网 时间:2024/06/08 10:43
vector
是C++标准模板库中的部分内容,是一种容器。它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
使用它时需要包含头文件:#include
vector类型的初始化:
vector a ; //声明一个int型向量a;
vectora(10); //声明一个大小为是10的向量a;
vector a(10, 1) ; //声明一个初始大小为10,初始值都为1的向量;
int b[7]={1,2,3,4,5,9,8};vector a(b,b+7); //从数组中获得初值
vector的基本操作:
vector的基本实现
//构造函数Vector() :_start(NULL) , _finish(NULL) , _endOfStorage(NULL){}Vector(int n, const T& data = T()) :_start(NULL) , _finish(NULL) , _endOfStorage(NULL){ _start = new T[n]; for (size_t i = 0; i < n; ++i) { _start[i] = data; } _finish = _start + n; _endOfStorage = _finish;}//拷贝构造函数Vector(const Vector<T>& v) :_start(0) , _finish(0) , _endOfStorage(0){ //可以分为两种情况:①容量等于size(stl) ②容量大于size size_t size = v.Size(); _start = new T[size]; /*for (size_t i = 0; i < size; ++i) { _start[i] = v._start[i]; }*/ __Copy<T>(_start, v._start, size); _finish = _start + v.Size(); _endOfStorage = _finish;}size_t Size()const{ return _finish - _start;}size_t Capacity()const{ return _endOfStorage - _start;}void PopBack(){ if (_start) { --finish; }}Iterator Begin(){ return _start;}ConstIterator Begin()const{ return _start;}Iterator End(){ return _finish;}ConstIterator End()const{ return _finish;}//增容void CheckEndOfStorage(){ size_t size = Size(); if (_finish == _endOfStorage) { Iterator tmp = new T[2 * size + 3]; for (size_t i = 0; i < size; ++i) { tmp[i] = _start[i]; } delete[] _start; _start = tmp; _finish = _start + size; _endOfStorage = _start + 2 * size + 3; }}//插入(存在迭代器失效问题)void Insert(Iterator& pos,const T& value){ size_t size = pos - _start; size_t oldSize = Size(); if (pos == End() && _finish < _endOfStorage) { _start[oldSize] = value; ++_finish; } else { CheckEndOfStorage(); Iterator it = _finish; pos = _start + size;//重置pos while (pos != it) { *it = *(it - 1); it--; } *pos = value; ++_finish; }}//将参数给成引用可以解决迭代器失效问题Iterator Erase(Iterator& pos){ Iterator end = End(); Iterator cur = pos; while (cur != end) { *cur = *(cur + 1); cur++; } --_finish; pos--; return pos;}T& operator[](size_t index){ return *(_start + index)}const T& operator[](size_t index)const{ return *(_start + index)}void Expand(size_t size){ size_t capacity = Capacity(); if (size == capacity) { capacity = capacity + capacity / 2; if (capacity < Size() + 1) { capacity = Size() + 1; } } _start = new T[capacity]; _finish = _start + size; _endOfStorage = _start + capacity;}bool Empty(){ return _start == _finish;}void Print(){ size_t size = Size(); for (size_t i = 0; i < size; ++i) { cout << _start[i] << " "; } cout << endl;}//析构函数~Vector(){ if (_start) { delete[] _start; _start = NULL; _finish = NULL; _endOfStorage = NULL; }}
list
list 的特色是在集合的任何位置增加或删除元素都很快,但是不支持随机存取,list 以模板方式实现(即泛型),可以处理任意型别的变量,包括使用者自定义的资料型态例如:它可以是一个放置整数(int)型态的 list、也可以是放置字串(char 或 string)型态的 list、或者放置使用者自定类别(user-defined class)的 list,但是随机访问却比较慢。
常用的操作:
基本实现:
template<class T> struct __ListNode { T _data; __ListNode<T>* _next; __ListNode<T>* _prev; __ListNode(const T& x) :_data(x) ,_next(NULL) ,_prev(NULL) { } }; template <class T,class Ref,class Ptr > struct __ListIterator { typedef __ListNode<T> Node; typedef __ListIterator<T,Ref,Ptr> Self; __ListIterator(Node* node) :_node(node) { } Ref operator*() { return _node->_data; } Ptr operator->() { return &(_node->_data) } Self& operator++() { _node=_node->_next; return *this; } Self& operator--() { _node=_node->_prev; return *this; } Self operator++(int) { Self tmp=_node; _node=_node->_next; //return tmp; return Self(tmp) } Self operator--(int) { Self tmp=(*this); _node=_node->_prev; return tmp; } bool operator!=(const Self& s) const { return this->_node!=s._node; } bool operator==(const Self& s) const { return this->_node==s._node; } Node* _node; }; template<class T> struct List { typedef __ListNode<T> Node; public: typedef __ListIterator<T,T&,T*> Iterator; typedef __ListIterator<T,const T&,const T*> ConstIterator; Node* GetNode(const T& x) { return new Node(x); } List() { _head=GetNode(T()); _head->_next=_head; _head->_prev=_head; } Iterator Begin() { return Iterator(_head->_next); } Iterator End() { return Iterator(_head); } ConstIterator Begin() const { return ConstIterator(_head->_next); } ConstIterator End() const { return ConstIterator(_head); } void PushBack(const T& x) { /* Node* _tail=_head->_prev; Node* tmp=GetNode(x); _tail->_next=tmp; tmp->_prev=_tail; tmp->_next=_head; _head->_prev=tmp;*/ Insert(End(),x); } void PopBack() { /* assert(_head->_prev ); Node* tail=_head->_prev; Node* prev=tail->_prev; Node* next=tail->_next; prev->_next=next; next->_prev=prev; delete tail;*/ Erase(--End()); } void PushFront(const T& x) { /*assert(_head) Node* tmp=GetNode(x); Node* next=_head->_next; _head->_next=tmp; tmp->_prev=_head; tmp->_next=next; next->_prev=tmp;*/ Insert(Begin(),x); } void PopFront() { /*assert(_head->_next); Node* tmp=_head->_next; Node* next=tmp->_next; _head->_next= next; next->_prev=_head; delete tmp;*/ Erase(Begin()); } Iterator Insert(Iterator pos, const T& x) { assert(pos._node); Node* tmp=GetNode(x); Node* cur=pos._node; Node* prev=cur->_prev; prev->_next=tmp; tmp->_prev=prev; tmp->_next=cur; cur->_prev=tmp; return tmp; } Iterator Erase(Iterator pos) { assert(pos._node && pos._node!=NULL); Node* tmp=pos._node; Node* next=tmp->_next; Node* prev=tmp->_prev; next->_prev=prev; prev->_next=next; delete tmp; return Iterator(next); } protected: Node* _head; }; void PrintList(const List<int>& l) { List<int>::ConstIterator It=l.Begin(); while(It!=l.End()) { cout<<*It<<" "; ++It; } cout<<endl; }
阅读全文
0 0
- vector和list的使用
- vector和list的使用
- Vector和List的使用
- vector和list的使用
- vector和list的区别和使用
- STL中vector和list的使用
- vector和list的使用及区别
- Vector&List的使用
- stl vector list的使用
- 【STL】STL 中vector和list的使用
- (C++)vector & list 的使用和模拟实现
- vector和list的使用及其模拟实现
- vector和list的区别
- list和vector的区别
- vector和list的区别
- list和vector的区别
- vector和list 的区别
- vector和list的区别
- 头插法建立单链表的算法
- 配置bash on windows前端开发环境
- PyTorch笔记6-mini batch
- EularProject 85:Counting rectangles
- 创建chart图像
- vector和list的使用
- 宏的本质以及宏(包括函数式宏) 没有返回值概念
- 浅析函数栈帧、变量的创建与销毁
- 带图【傻瓜式操作】phpstrom php出现404错误的解决方法
- JavaScript中call,apply,bind方法的总结
- UVALive 6172|HDU 4484|Hailstone HOTPO|模拟
- MySql级联删除和更新
- 腾讯云服务器Mysql开启3306端口远程访问
- sublime常用快捷键