C++中list的用法总结

list简介

list 也是顺序容器的一种。只是list 是一个双向链表。使用 list 需要包含头文件 list。双向链表的每个元素中都有一个指针指向后一个元素,也有一个指针指向前一个元素,如下图所示。

当然,list的用法和vector很类似,也拥有顺序容器中的常用方法,需要注意的是**list不支持使用下标随机存取元素。
在 list 容器中,在已经定位到要增删元素的位置的情况下,增删元素能在常数时间内完成。如下图所示,在 ai 和 ai+1 之间插入一个元素,只需要修改 ai 和 ai+1 中的指针即可:

list的成员函数

void push_front(const T & val)                                  将 val 插入链表最前面

void pop_front()                                                        删除链表最前面的元素

void sort()                                                                 将链表从小到大排序

void remove (const T & val)                                     删除和 val 相等的元素


remove_if                                                                 删除符合某种条件的元素

void unique()                                                            删除所有和前一个元素相等的元素

void merge(list <T> & x)                                           将链表 x 合并进来并清空 x。要求链表自身和 x 都是有序的


void splice(iterator i, list <T> & x, iterator first, iterator last)            在位置 i 前面插入链表 x 中的区间 [first, last),并在链表 x 中删除该区间。链表自身和链表 x 可以是同一个链表,只要 i 不在 [first, last) 中即可

list的用法实例

#include <iostream>
#include <list>

using namespace std;


int main(){

int a[6] = {1,3 ,2, 5,2,3};
int b[5] = {1,3,2,4,6};

list<int> L(a,a+6);
list<int> Lb(b,b+5);
list<int>::iterator pl;


cout<< "element in L : " ;
for(pl = L.begin(); pl != L.end();++pl){
    cout << *pl << " " ;
}
cout << endl;

cout<< "element in Lb : " ;
for(pl = Lb.begin(); pl != Lb.end();++pl){
    cout << *pl << " " ;
}
cout << endl;

L.sort();
cout<< "1) sort L: " ;

for(pl = L.begin(); pl != L.end();++pl){
    cout << *pl << " " ;
}
cout << endl;

cout <<"2) after delete element 2: ";
L.remove(2);
for(pl = L.begin(); pl != L.end();++pl){
    cout << *pl << " " ;
}
cout << endl;


cout << "3) delete first element in Lb: ";
Lb.pop_front();
for(pl = Lb.begin(); pl != Lb.end();++pl){
    cout << *pl << " " ;
}
cout << endl;

cout << "4) delete all same element in L: ";
L.unique();
for(pl = L.begin(); pl != L.end();++pl){
    cout << *pl << " " ;
}
cout << endl;

//使用merge
Lb.sort();
L.merge(Lb);
cout << "5) merge L with Lb: ";
L.unique();
for(pl = L.begin(); pl != L.end();++pl){
    cout << *pl << " " ;
}
cout << endl;
cout << "   size of Lb: " << Lb.size()<<endl;

L.reverse();
cout << "6) reverse L ";
 for(pl = L.begin(); pl != L.end();++pl){
    cout << *pl << " " ;
}
cout << endl;

return 0;
}

输出结果如下:

作者:醉曦
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。

posted @   醉曦  阅读(45072)  评论(6编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示