C++ STL入门教程(2) list双向链表使用方法(附程序代码)
发布时间 - 2026-01-11 02:50:45 点击率:次一、简介

“Unlike other standard sequence containers, list and forward_list objects are specifically designed to be efficient inserting and removing elements in any position, even in the middle of the sequence.”
Lists将元素按顺序储存在链表中。与向量(vector)相比, 它允许快速的插入和删除,但是随机访问却比较慢。(vector支持快速随机访问)
在前一篇就提到过,list可以在头部进行添加删除操作,但vector不行。
下面是几个list特有的函数。(从另一方面说明list在删除操作方面的速度之快)
remove() 从list删除元素
remove_if() 按指定条件删除元素
reverse() 把list的元素倒转
sort() 给list排序
unique() 删除list中重复的元素
二、完整程序代码
/*请务必运行以下程序后对照阅读*/
#include <list>
#include <iostream>
#include <algorithm>
using namespace std;
void print(int num)
{
cout << num << " ";
}
bool IsOdd(int i)
{
return ((i & 1) == 1);
}
int main()
{
//1. 初始化
list<int> v;
list<int>::iterator iv;
v.assign(10, 2);//将10个值为2的元素赋到list中
cout << v.size() << endl; //返回list实际含有的元素数量
cout << endl;
//2. 添加
v.push_front(666);
for (int i = 0; i < 10; i++)
v.push_back(i);
for_each(v.begin(), v.end(), print);//需要#include <algorithm>
cout << endl;
cout << v.size() << endl;
cout << endl;
//3. 插入及遍历、逆遍历和倒转
v.insert(v.begin() , 99);//不能+和-了
v.insert(v.end() , 99);
for_each(v.begin(), v.end(), print);
cout << endl;
for_each(v.rbegin(), v.rend(), print);//在逆序迭代器上做++运算将指向容器中的前一个元素
cout << endl;
//一般遍历写法
for(iv = v.begin(); iv != v.end(); ++iv)
cout << *iv << " ";
cout << endl;
v.reverse();
for_each(v.begin(), v.end(), print);
cout << endl;
for_each(v.rbegin(), v.rend(), print);
cout << endl;
cout << endl;
//4. 排序
v.sort();//为链表排序,默认是升序。
for_each(v.begin(), v.end(), print);
cout << endl;
cout << endl;
//5. 删除
v.erase(v.begin());
for_each(v.begin(), v.end(), print);
cout << endl;
v.insert(v.begin() , 99);//还原
//删掉链表中所有重复的元素
v.unique();
for_each(v.begin(), v.end(), print);
cout << endl;
//去掉所有含2的元素
v.remove(2);
for_each(v.begin(), v.end(), print);
cout << endl;
//删掉所有奇数
v.remove_if(IsOdd);
for_each(v.begin(), v.end(), print);
cout << endl;
v.pop_front();
v.pop_back();
for_each(v.begin(), v.end(), print);
cout << endl;
cout << endl;
//6. 查询
cout << v.front() << endl;
cout << v.back() << endl;
//7. 清空
v.clear();
cout << v.size() << endl;//0
for_each(v.begin(), v.end(), print); //已经clear,v.begin()==v.end(),不会有任何结果。
return 0;
}
当然,我们也可以用动态数组作为保存的数据类型:
#include<iostream>
#include<string>
#include<list>
using namespace std;
int main()
{
list<char *> li;
list<char *>::iterator iter;
li.push_back("123");
li.push_back("456");
li.push_back("789");
for (iter = li.begin(); iter != li.end(); ++iter)
cout << *iter << endl;
return 0;
}
三、补充
对比vector和list在查询(随机检索)和维护(插入和删除)上的区别:
a) 查询
vector:由于vector中的元素是连续存储的,所以我们能够直接的访问第n个元素。
list:由于list中的元素不是在内存中连续存储的,下一个元素的内存地址保存在前一个元素中,所以我们必须一个一个的访问前面的元素,最后才能访问第n个元素。
当然,对于顺序访问就二者就差不多了。
b) 维护
vector:在vector中插入/删除一个元素的话,我们需要移动插入/删除位置之后的所有元素。如果在vector插入/删除元素后有大量元素的情况下,显而易见,这些移动和删除操作会大量的消耗CPU时间。
list:使用list进行这些操作的时候,其仅仅是修改插入/删除元素之前的元素到后一个元素的指针则可以完成这些操作,这样可以节约大量的CPU时间。
参考网站:http://www.cplusplus.com/reference/list/list/
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# C++
# STL
# list
# 双向链表
# 详解C++ STL模拟实现forward_list
# 详解C++ STL模拟实现list
# 利用C++模拟实现STL容器:list
# C++ STL标准库之std::list使用介绍及用法详解
# C++ STL之list双向链表容器方式
# 遍历
# 链表
# 在前
# 升序
# 几个
# 是在
# 可以用
# 仅仅是
# 特有的
# 显而易见
# 则可
# 我们必须
# 值为
# 之快
# 大家多多
# 就差
# 较慢
# 清空
# 却比
# 有任何
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
详解jQuery中的事件
ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法
简历没回改:利用AI润色让你的文字更专业
如何在香港服务器上快速搭建免备案网站?
JavaScript常见的五种数组去重的方式
Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】
JavaScript如何实现音频处理_Web Audio API如何工作?
浅谈Javascript中的Label语句
如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
七夕网站制作视频,七夕大促活动怎么报名?
Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
如何在阿里云通过域名搭建网站?
想要更高端的建设网站,这些原则一定要坚持!
香港服务器如何优化才能显著提升网站加载速度?
Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康
如何在云主机上快速搭建网站?
青岛网站建设如何选择本地服务器?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
如何在宝塔面板中创建新站点?
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
网站制作报价单模板图片,小松挖机官方网站报价?
如何快速生成凡客建站的专业级图册?
在线制作视频网站免费,都有哪些好的动漫网站?
制作公司内部网站有哪些,内网如何建网站?
微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】
Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全
如何在IIS7中新建站点?详细步骤解析
如何生成腾讯云建站专用兑换码?
大同网页,大同瑞慈医院官网?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】
如何在IIS中新建站点并配置端口与IP地址?
网站制作免费,什么网站能看正片电影?
海南网站制作公司有哪些,海口网是哪家的?
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
深圳网站制作培训,深圳哪些招聘网站比较好?
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】
进行网站优化必须要坚持的四大原则
佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】
Laravel如何使用Blade模板引擎?(完整语法和示例)
微信小程序 HTTPS报错整理常见问题及解决方案
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
Laravel项目怎么部署到Linux_Laravel Nginx配置详解
如何在阿里云ECS服务器部署织梦CMS网站?
Laravel中间件如何使用_Laravel自定义中间件实现权限控制

