线性表、栈、队列
1.线性表
线性表有两种实现方式:顺序表和链表
具体实现见书上66页
顺序表的缺点是大小是事先固定的,当所存元素较少时,浪费很多空间。
链表的缺点是每个结点上附加一个指针开销。
线性表适合查询,访问。
而链表适合插入,删除。
还有一种结构是双链表,包括一个prev和一个next指针。
2.栈stack
栈是限定仅在一端进行插入或者删除操作的线性表。LIFO:后进先出
栈可访问的元素只有栈顶,操作包括入栈,出栈。
栈的实现方式包括顺序栈和链式栈。
3.队列queue
队列元素只能从队尾插入(入队,enqueue),从队首删除(出队,dequeue)。FIFO:先进先出。
队列的实现包括顺序队列和链式队列。
4.字典ADT
定义字典的关键码和可比较对象,可使用顺序表实现字典,也可使用有序顺序表实现字典,取决于所使用的哪种操作更加频繁。
STL中有顺序容器:
vector, deque,list, forward_list, array, string
没有特殊情况时最好用vector。
一些特殊操作:
c.Push_back(t): forward_list无此操作
c.Emplace_back(args):forward_list无此操作
c.Push_front(t):vector or string 无此操作
c.Emplace_front(args):vector or string 无此操作
c.Insert(p,t); //insertt befor iterator p
c.insert(p,n,t)//insertn 个 t beforiterator p
c.insert(p,b,e)//insert iterator b 到 e的范围的数 beforiterator p
c.insert(p,i1);//i1是一系列的参数列表,比如: c.insert(c.end(),{4,5,6});
赋值时,auto类型十分好用。
c.pop_back():remove the last element in c, forward_list无此操作
c.pop_front():removefirst element in c, vector or string 无此操作
c.erase(p)
c.erase(b,e)
c.clear();
对于forward_list的特殊操作:
Lst.before_begin():iterator denoting nonexistence element befor the begin of the list
Lst.cbefor_begin():
Lst.insert_after(p,t)
Lst.insert_after(p,n,t)
Lst.insert_after(p,b,e)
Lst.insert_after(p.i1)
Emplace_after(p,args)
Lst.erase_after(p)
Lst.erase_after(b,e);(b,e之间不包括b,e)
c.resize(n);
c.resize(n,t);
除此之外,还有stack,queue,priority_queue的应用