容器list与slist的简单应用

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值