STL中List是双向链表,而Slist是单向链表。它们的区别:Slist的迭代器是单向的Forward Iterator,而list的迭代器是双向的Bidirectional Iterator。Slist所耗用的空间更小,操作更快。它们共同的特点是,插入、移除、接合等操作并不会造成原有的迭代器失效。slist插入时,需要从前遍历,找到插入点的位置。为了更快插入,提供了insert_after,erase_after。
list与slist的示意图:
简单应用:
#include <iostream>
#include <slist>
#include <list>
using namespace std;
int main(){
slist<int> sl; //创建一个不存在任何元素的slist对象sl
list<int> ls;
slist<int>::iterator islist;//创建容器迭代器,访问容器中的元素
list<int>::iterator ilist;
ls.push_front(2);//在list的头部添加一个元素
ls.push_front(1);
ls.push_back(3);//在list的末尾添加一个元素
ls.push_back(4);
ls.push_back(5);
ilist = --ls.end();
cout << *ilist << endl;
--ilist;
cout << *ilist << endl;
--ilist;
ilist = ls.erase(ilist);//删除当前位置的元素,ilist向后移一位
//ls.erase(ilist);//ilist仍指向当前位置
cout << *ilist << endl;
ilist = ls.insert(ilist,3);//ilist指向当前插入的元素
//ls.insert(ilist,3);//ilist指向插入之前的元素
cout << *ilist << endl;
for(ilist=ls.begin(); ilist!=ls.end(); ilist++)
cout << *ilist << " ";
cout<<endl;
islist = sl.previous(sl.end());
cout<<*islist<<endl;
islist = sl.insert_after(islist, 61);
//++iLast;//注意slist没有实现operator--,因为这是一个forward iterator
islist=sl.begin();
cout<<*islist<<endl;
islist = sl.insert_after(islist, 62); //在当前位置islist后面插入后,iLast指向当前插入的元素
cout<<*islist<<endl;
sl.push_front(66);//在slist的头部添加一个元素
islist = sl.insert_after(islist, 63);
cout << *islist <<endl; //结果为63
sl.insert_after(islist, 64);
cout << *islist <<endl; //结果为63,islist仍指向63
sl.insert_after(islist,65);//此时,slist中元素排列为66 61 62 63 65 64,islist仍指向63
islist = sl.erase_after(islist);//删除islist指向的元素后面的元素,ilist向后移一位
sl.erase(islist);//删除islist所指向的元素,islist指向删除的元素
//sl.erase_after(islist);删除islist指向的元素后面的元素,ilist仍指向63
cout << *islist <<endl;
islist = sl.previous(sl.end());
cout<<*islist<<endl;
//从头到尾打印链表元素
for(islist=sl.begin(); islist!=sl.end(); islist++)//打印61 62 63 64 65
cout << *islist << " ";
cout << endl;
return 0;
}
运行结果:
5
4
4
3
1 2 3 4 5
-858993460
61
62
63
63
64
63
66 61 62 63