容器list与slist的简单应用

来源:互联网 发布:mysql截取日期年月日 编辑:程序博客网 时间:2024/05/08 13:51

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


0 0