STL中的list——改名换性的双链表

STL中的list

list 双向循环列表

list也就是我们通常所说的双向链表容器。与vector相比,list可以快速地插入和删除,但是不能根据索引来随机读取。

  • 头文件
#include<list>
  • 常用api
  1. list<type>obj
list<int> obj;								//声明空的list
list<int> obj(10);							//声明包含十个结点的list,初始值为0
list<int> obj(10, 5);						//初始值为5
list<int> obj(obj2);						//用obj2声明obj,要求obj2是list
list<int> obj(obj2.begin(), obj2.end());	//这里的obj2可以是数组、array、list
  1. obj.begin()

返回指向容器中第一个元素的双向迭代器

  1. obj.end()

返回指向容器最后一个元素下一位的双向迭代器

  1. obj.rbegin()

reverse版本的begin,即返回指向最后一个元素的反向双向迭代器

  1. obj.rend()

reverse版本的end,即返回指向第一个元素的前一位

注:在上述四个函数名前增加”c“,即cbegin,crbegin,cend,crend,表示增加const属性,对应的迭代器将不能用于修改元素。

  1. obj.empty()

判断容器内是否有元素

  1. obj.size()

返回当前容器实际包含的元素个数

  1. obj.max_size()

返回容器能包含的元素个数的最大值

  1. obj.resize(num)

改变链表长度

  1. obj.front()

返回第一个元素的引用

  1. obj.back()

返回最后一个元素的引用

  1. obj.assign(n, elem)
int a[]={1,2,3,4,5};
obj.assign(2,10);					//将2个10赋给链表
obj.assign(a,a+5);					//用指针的方法赋值

注意这种方法会覆盖原链表

  1. obj.push_front(elem)

在链表头部插入一个元素

  1. obj.pop_front()

在链表尾部删除一个元素

  1. obj.push_back(elem)

在链表尾部插入一个元素

  1. obj.pop_back()

在链表尾部深处一个元素

  1. obj.emplace()

在指定位置直接生成新元素,注意当前位置原来的数直接移动到下一位

  1. obj.insert(iterator , elem)

在指定位置插入元素

obj.insert(pos, elem);				//在pos(迭代器)位置插入元素
obj.insert(pos, n, elem);			//在pos位置之前插入n个elem
obj.insert(pos, left, right);		//在pos位置插入其他容器区间内的元素
obj.insert(pos, list);				//在pos位置插入初始化list
  1. obj.erase(iterator)

删除一个或某区域的元素

  1. obj.splice(iterator, list)

将其他list容器储存的多个元素添加到当前list的指定位置

obj.splice(pos, list);				//将list插入到pos位置
obj.splice(pos, list, it);			//将list中it位置元素插入到pos位置
obj.splice(pos, list, first, last);	//将list中[first, last)中的元素插入到pos位置

程序演示

#include<iostream>
#include<list>

using namespace std;

//顺序遍历输出
void sequentail_output(list<int> obj){
    list<int>::iterator it;
    cout << "list:";
    for (it = obj.begin(); it != obj.end(); it++){
        cout << *it << " ";
    }
    cout << endl;
}

//逆序遍历输出
void reverse_output(list<int> obj){
    list<int>::reverse_iterator it;
    cout << "reverse:";
    for (it = obj.rbegin(); it != obj.rend(); it++){
        cout << *it << " ";
    }
    cout << endl;
}

int main()
{
    //声明链表
    list<int> obj(6, 3);
    
    //插入元素
    obj.push_back(1);
    obj.push_front(5);
    
    //输出链表长度
    cout << "size: " << obj.size() << endl;
    //改变链表长度
    //obj.resize(0)
    
    //顺序遍历输出
    sequentail_output(obj);
    //逆序遍历输出
    reverse_output(obj);

    //删除元素
    obj.pop_back();
    obj.pop_front();
    sequentail_output(obj);

    //给链表元素赋值
    obj.assign(2, 10);
    sequentail_output(obj);

    //插入元素
    obj.insert(++obj.begin(), 9);
    sequentail_output(obj);
    //删除元素
    obj.erase(--obj.end());
    reverse_output(obj);
    //中间生成元素
    obj.emplace(--obj.end(), 2);
    sequentail_output(obj);

    //取出头部元素
    cout << "front: " << obj.front() << endl;
    //取出尾部元素
    cout << " back: " << obj.back() << endl;

    //将其他list插入到指定位置
    list<int> obj2(3, 7);
    obj.splice(obj.begin(), obj2);
    sequentail_output(obj);


}
  • 运行结果
size: 8
list:5 3 3 3 3 3 3 1
reverse:1 3 3 3 3 3 3 5
list:3 3 3 3 3 3
list:10 10
list:10 9 10
reverse:9 10
list:10 2 9
front: 10
 back: 9
list:7 7 7 10 2 9
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值