vector和list的区别,vector是list的实现类吗

  vector和list的区别,vector是list的实现类吗

  vector和list的区别

   vector的随机存取效率高,但由于插入和删除时需要移动数据(不包括尾部),操作起来比较困难。

  链表的访问必须遍历整个链表,随机访问效率低。不过,插入和删除数据很方便,只需改变指针。

  列表是单向的,向量是双向的。

  Vector中的迭代器使用后会失效,而list中的迭代器使用后可以继续使用。

  vector的使用

  连续存储结构:vector是一个可以动态增长的对象数组。它支持对数组的高效访问以及在数组末尾的删除和插入。中间和头部的删除和插入相对困难,需要移动大量数据。vector和array最大的区别在于,Vector不需要程序员考虑容量问题,库本身实现了容量的动态增长,array则需要程序员手动编写扩展函数来扩展容量。

  矢量的仿真实现

  模板类T

  分类向量

  {

  公共:

  typedef T*迭代器;

  typedef const T * Iterator

  向量()

  :_start(空)

  ,_完成(空)

  ,_endOfStorage(空)

  {}

  void模板类T

  推回(常数T x)

  {

  迭代器End=End();

  Insert(end,x);

  }

  空插入(迭代器位置,常量x)

  {

  size _ t n=pos-_ start;

  if (_finish==_endOfStorage)

  {

  size_t len=Capacity()==0?3:容量()* 2;

  expand(len);

  }

  pos=_ start n;

  for(迭代器End=End();结束!=pos-结束)

  {

  * end=*(end-1);

  }

  * pos=x;

  _完成;

  }

  迭代器结束()

  {

  返回_完成;

  }

  迭代器Begin()

  {

  返回_开始;

  }

  Void Resize (size _ t n,const t val=t())//当使用Resize来扩展容量时,需要初始化空间,可以减少容量。

  {

  if (n Size())

  {

  _ finish=_ start n;

  }

  其他

  {

  储备(n);

  Size _ t len=n-Size();

  for(size _ t I=0;我len我)

  {

  推回(val);

  }

  }

  }

  Void Reserve(size_t n)//不初始化空间直接增加容量

  {

  展开(n);

  }

  inline size_t Size()

  {

  return _ finish-_ start;

  }

  inline size_t容量()

  {

  return _ endof storage-_ start;

  }

  无效扩展(大小为n)

  {

  const Size _ t Size=Size();

  const size _ t Capacity=Capacity();

  中频(n容量)

  {

  T * tmp=new T[n];

  for(size _ t I=0;I尺寸;我)

  {

  tmp[I]=_ start[I];

  }

  delete[]_ start;

  _ start=tmp

  _ finish=_ start size

  _ endof storage=_ start n;

  }

  }

  测试运算符[](size_t pos)

  {

  assert(pos Size());

  return _ start[pos];

  }

  常量T运算符[](size_t pos)常量

  {

  assert(pos Size());

  return _ start[pos];

  }

  受保护:

  Iterator _ start//指向第一个元素所在的节点

  Iterator _ finish//指向最后一个元素所在节点的下一个节点

  Iterator _ endOfStorage//可用内存空间的结束节点

  };list的使用

  不连续存储结构:list是一种双向链表结构,支持链表的双向遍历。每个节点包括三条信息:元素本身、指向前一个元素的节点(prev)和指向下一个元素的节点(next)。因此,list可以在任何位置高效地访问、插入和删除数据元素。因为涉及到额外指针的维护,开销比较大。

  列表的模拟实现

  模板类T

  根据考试成绩分等级排列的投考者的名单

  {

  typedef __ListNodeT节点;

  公共:

  typedef _ _ ListIteratorT,T,T*迭代器;

  typedef _ _ ListIteratorT,const T,const T * ConstIterator

  迭代器Begin()

  {

  return _ head-_ next;

  }

  迭代器结束()

  {

  return _头;

  }

  ConstIterator Begin()常量

  {

  return _ head-_ next;

  }

  ConstIterator End() const

  {

  return _头;

  }

  列表()

  {

  _head=新节点(T());

  _ head-_ next=_ head;

  _ head-_ prev=_ head;

  }

  //l2(l1)

  列表(常量列表l)

  {

  _head=新节点(T());

  _ head-_ next=_ head;

  _ head-_ prev=_ head;

  ConstIterator it=l . Begin();

  而(它!=l.End())

  {

  推后(* it);

  它;

  }

  }

  ~列表()

  {

  clear();

  删除_头

  _ head=NULL

  }

  空清除()

  {

  迭代器it=Begin();

  而(它!=End())

  {

  Node* del=it ._ node

  它;

  删除倒三角形

  }

  _ head-_ next=_ head;

  _ head-_ prev=_ head;

  }

  无效推回(常数x)

  {

  Insert(End(),x);

  }

  无效推进(常数x)

  {

  Insert(Begin(),x);

  }

  void PopBack()

  {

  erase(-End());

  }

  void PopFront()

  {

  erase(Begin());

  }

  空插入(迭代器位置,常量x)

  {

  节点*当前=位置. node节点

  node * prev=cur-_ prev;

  节点* tmp=新节点;

  prev-_ next=tmp;

  tmp-_ prev=prev;

  tmp-_ next=cur;

  cur-_ prev=prev;

  }

  迭代器擦除(迭代器位置)

  {

  断言(位置!=End());

  Node* prev=(位置. node)_ prev;

  Node* next=(位置. node)_ next;

  prev-_ next=next;

  next-_ prev=prev;

  删除位置. node节点

  位置. node=prev

  返回迭代器(下一个);

  }

  受保护:

  节点* _头

  };推荐学习:Java视频教程以上就是爪哇岛中矢量与目录的区别是什么?的详细内容,更多请关注我们其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: