当前位置: 首页 > wzjs >正文

网页站点的用途网站里的友情链接

网页站点的用途,网站里的友情链接,前端和后端是什么意思,怎么做网站端口代理在 C 的标准模板库(STL)中,list作为一种重要的序列式容器,以其独特的双向链表结构和丰富的操作功能,在许多编程场景下发挥着关键作用。深入理解list的特性与使用方法,能帮助开发者编写出更高效、灵活的代码…

在 C++ 的标准模板库(STL)中,list作为一种重要的序列式容器,以其独特的双向链表结构和丰富的操作功能,在许多编程场景下发挥着关键作用。深入理解list的特性与使用方法,能帮助开发者编写出更高效、灵活的代码。

一、list 的结构特点

list的底层是双向链表结构,这意味着每个元素都存储在独立的结点中,每个结点通过指针分别指向其前一个元素和后一个元素。这种结构使得list在任意位置进行插入和删除操作时,都能在常数时间内完成,效率极高。例如,当需要在链表中间插入一个新元素时,只需修改相关指针的指向,无需像数组那样移动大量元素。同时,双向链表的结构还支持前后双向迭代,方便从两个方向遍历容器。

forward_list相比,list的双向链表结构虽然在功能上更强大,但也带来了一些额外的开销。由于每个结点都需要额外的空间来存储前后指针,对于存储类型较小的元素,这些额外空间的占用可能会对内存使用产生较大影响。而且,与数组和向量不同,list不支持随机访问,不能通过下标直接访问特定位置的元素,这在一些需要频繁随机访问的场景下会带来不便。

二、list 的使用方法

(一)定义方式

list提供了多种灵活的定义方式。可以构造一个空容器,如list<int> lt1;,用于后续动态添加元素。也能创建一个包含指定数量且值相同的元素的容器,像list<int> lt2(10, 2);,这里的lt2就包含了 10 个值为 2 的元素。通过拷贝构造,能复制已有容器的内容,list<int> lt3(lt2);lt2的内容复制到lt3中。此外,还可以利用迭代器或数组区间来初始化list,例如:

#include <iostream>
#include <list>
#include <string>
using namespace std;int main() {list<int> lt1;list<int> lt2(10, 2);list<int> lt3(lt2);string s("hello world");list<char> lt4(s.begin(), s.end()); int arr[] = { 1, 2, 3, 4, 5 };int sz = sizeof(arr) / sizeof(int);list<int> lt5(arr, arr + sz); // 打印各个list的内容cout << "lt1: ";for (int i : lt1) {cout << i << " ";}cout << endl;cout << "lt2: ";for (int i : lt2) {cout << i << " ";}cout << endl;cout << "lt3: ";for (int i : lt3) {cout << i << " ";}cout << endl;cout << "lt4: ";for (char c : lt4) {cout << c << " ";}cout << endl;cout << "lt5: ";for (int i : lt5) {cout << i << " ";}cout << endl;return 0;
}

 

(二)插入和删除操作

  1. 头部操作push_frontpop_front函数分别用于在容器头部插入和删除元素。这在需要频繁在头部添加或删除数据的场景下非常实用,比如实现一个栈结构时,就可以利用list的这些操作。
#include <iostream>
#include <list>
using namespace std;int main() {list<int> lt;lt.push_front(1);lt.push_front(2);cout << "After push_front, list: ";for (int i : lt) {cout << i << " ";}cout << endl;lt.pop_front();cout << "After pop_front, list: ";for (int i : lt) {cout << i << " ";}cout << endl;return 0;
}

  1. 尾部操作push_backpop_back函数则用于在容器尾部进行插入和删除操作,在实现队列结构时经常会用到。
#include <iostream>
#include <list>
using namespace std;int main() {list<int> lt;lt.push_back(1);lt.push_back(2);cout << "After push_back, list: ";for (int i : lt) {cout << i << " ";}cout << endl;lt.pop_back();cout << "After pop_back, list: ";for (int i : lt) {cout << i << " ";}cout << endl;return 0;
}

  1. 指定位置操作insert函数支持在指定迭代器位置进行多种插入操作,包括插入一个数、插入多个相同值的数以及插入一段迭代器区间。erase函数可以删除指定迭代器位置的元素或指定迭代器区间内的所有元素。在使用这些函数时,通常会结合<algorithm>头文件中的find函数来定位要操作的位置。
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;int main() {list<int> lt = { 1, 2, 3, 4, 5 };auto it = find(lt.begin(), lt.end(), 3);if (it != lt.end()) {lt.insert(it, 10);  // 在找到的元素3前插入10cout << "After insert, list: ";for (int i : lt) {cout << i << " ";}cout << endl;lt.erase(it);  // 删除元素3cout << "After erase, list: ";for (int i : lt) {cout << i << " ";}cout << endl;}return 0;
}

 

(三)迭代器使用

list的迭代器分为正向迭代器和反向迭代器。通过begin函数获取容器中第一个元素的正向迭代器,end函数获取最后一个元素后一个位置的正向迭代器,利用正向迭代器可以从前往后遍历容器。而rbeginrend函数分别返回容器中最后一个元素的反向迭代器和第一个元素前一个位置的反向迭代器,方便从后往前遍历容器。

#include <iostream>
#include <list>
using namespace std;int main() {list<int> lt = { 1, 2, 3, 4, 5 };// 正向迭代器遍历cout << "Forward iteration: ";for (auto it = lt.begin(); it != lt.end(); ++it) {cout << *it << " ";}cout << endl;// 反向迭代器遍历cout << "Reverse iteration: ";for (auto it = lt.rbegin(); it != lt.rend(); ++it) {cout << *it << " ";}cout << endl;return 0;
}

 

(四)元素获取与大小控制

使用frontback函数可以轻松获取list容器中的第一个和最后一个元素。size函数用于获取容器中当前元素的个数,resize函数能够调整容器的大小,根据传入参数的不同,实现扩大或缩小容器。empty函数用于判断容器是否为空,clear函数则可以清空容器中的所有元素。


#include <iostream>
#include <list>
using namespace std;int main() {list<int> lt = { 1, 2, 3, 4, 5 };cout << "前元素: " << lt.front() << endl;cout << "返回元素: " << lt.back() << endl;cout << "列表大小: " << lt.size() << endl;lt.resize(3);  // 缩小容器大小为3cout << "调整大小后,列表的大小: " << lt.size() << endl;if (lt.empty()) {cout << "列表为空" << endl;}else {cout << "列表不是空的" << endl;}lt.clear();if (lt.empty()) {cout << "清除后,列表为空" << endl;}else {cout << "清除后,列表不为空" << endl;}return 0;
}

 

(五)其他操作函数

  1. 排序与拼接sort函数可以将容器中的数据默认排为升序,在对数据顺序有要求时十分便捷。splice函数用于两个list容器之间的拼接,有多种拼接方式,可以将整个容器、某个元素或指定区间的数据拼接到另一个容器的指定位置,但要注意被拼接的数据会从原容器中移除。
#include <iostream>
#include <list>
using namespace std;int main() {list<int> lt1 = { 3, 1, 2 };list<int> lt2 = { 6, 4, 5 };lt1.sort();cout << "After sorting lt1: ";for (int i : lt1) {cout << i << " ";}cout << endl;lt1.splice(lt1.end(), lt2);  // 将lt2拼接到lt1的末尾cout << "After splice, lt1: ";for (int i : lt1) {cout << i << " ";}cout << endl;return 0;
}

  1. 元素删除与去重remove函数用于删除容器中特定值的元素,remove_if函数则可以删除满足特定条件的元素,unique函数用于删除容器中连续的重复元素,不过在使用unique函数去重前,通常需要先对容器内元素进行排序。
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;bool isEven(int num) {return num % 2 == 0;
}int main() {list<int> lt = { 1, 2, 2, 3, 4, 4, 5 };lt.remove(2);  // 删除值为2的元素cout << "After remove 2, list: ";for (int i : lt) {cout << i << " ";}cout << endl;lt.remove_if(isEven);  // 删除偶数元素cout << "After remove_if, list: ";for (int i : lt) {cout << i << " ";}cout << endl;lt = { 1, 2, 2, 3, 3, 3 };lt.sort();lt.unique();  // 去重cout << "After unique, list: ";for (int i : lt) {cout << i << " ";}cout << endl;return 0;
}

  1. 合并与其他操作merge函数用于将一个有序list容器合并到另一个有序list容器中,合并后容器依然保持有序。reverse函数用于逆置容器中元素的位置,assign函数可以用新内容替换容器的当前内容,swap函数用于交换两个容器的内容。
#include <iostream>
#include <list>
using namespace std;int main() {list<int> lt1 = { 1, 3, 5 };list<int> lt2 = { 2, 4, 6 };lt1.merge(lt2);  // 合并lt2到lt1cout << "After merge, lt1: ";for (int i : lt1) {cout << i << " ";}cout << endl;lt1.reverse();  // 逆置lt1cout << "After reverse, lt1: ";for (int i : lt1) {cout << i << " ";}cout << endl;list<int> lt3 = { 7, 8, 9 };lt1.assign(lt3.begin(), lt3.end());  // 用lt3的内容替换lt1cout << "After assign, lt1: ";for (int i : lt1) {cout << i << " ";}cout << endl;list<int> lt4 = { 10, 11, 12 };lt1.swap(lt4);  // 交换lt1和lt4的内容cout << "After swap, lt1: ";for (int i : lt1) {cout << i << " ";}cout << endl;return 0;
}

 

三、应用场景

  1. 数据频繁插入和删除:在实现一些需要频繁进行插入和删除操作的数据结构时,如优先队列、缓存管理等,list的高效插入和删除特性使其成为理想选择。例如,在缓存管理中,当有新数据进入缓存或旧数据被淘汰时,list能够快速调整数据顺序。
#include <iostream>
#include <list>
using namespace std;class Cache {
private:list<int> cacheList;int capacity;public:Cache(int cap) : capacity(cap) {}void access(int data) {for (auto it = cacheList.begin(); it != cacheList.end(); ++it) {if (*it == data) {cacheList.erase(it);cacheList.push_front(data);return;}}if (cacheList.size() >= capacity) {cacheList.pop_back();}cacheList.push_front(data);}void printCache() {for (int i : cacheList) {cout << i << " ";}cout << endl;}
};int main() {Cache cache(3);cache.access(1);cache.access(2);cache.access(3);cache.printCache();cache.access(2);cache.printCache();cache.access(4);cache.printCache();return 0;
}

  1. 链表相关算法实现:由于list本身就是基于双向链表结构,在实现链表相关的算法,如链表的反转、合并等时,直接使用list容器可以简化代码编写,并且能充分利用其内置的操作函数。
#include <iostream>
#include <list>
using namespace std;int main() {list<int> list1 = { 1, 2, 3 };list<int> list2 = { 4, 5, 6 };// 合并两个listlist1.merge(list2);cout << "After merging, list1: ";for (int i : list1) {cout << i << " ";}cout << endl;// 反转list1list1.reverse();cout << "After reversing, list1: ";for (int i : list1) {cout << i << " ";}cout << endl;return 0;
}

 

  1. 内存管理优化:在一些对内存使用有严格要求的场景下,如果数据元素之间的顺序关系较为灵活,且不需要频繁随机访问,list的动态内存分配和释放特性可以有效避免内存碎片问题,提高内存利用率。

list作为 C++ STL 中的重要容器,以其独特的双向链表结构和丰富的操作函数,在众多编程场景中都有着不可替代的作用。开发者在实际编程中,应根据具体需求,合理选择使用list,充分发挥其优势,提升程序的性能和质量。

http://www.dtcms.com/wzjs/520369.html

相关文章:

  • 平台网站建设有哪些方面推广宣传文案
  • 江苏公众科技网站建设seo就是搜索引擎广告
  • 网站开发专业简历互动营销
  • 网站制作学什么软件有哪些深圳网络推广团队
  • 免费网站建设排行榜引流客户的最快方法是什么
  • 茶叶网站建设策划书ppt上海网络推广培训机构
  • 标识公司网站关键词排名seo
  • w5500做服务器网站什么是seo
  • 南京营销型网站建设优化是什么梗
  • 企业网站做的比较好网络推广渠道
  • 济宁网站设计营销比较成功的品牌
  • 赤水网站建设360优化大师安卓手机版下载安装
  • 陕西建设网成绩查询天津百度网站快速优化
  • 山东网站建设好不好网站建设合同
  • 绍兴商城网站开发设计百度统计数据
  • 响应式网站一般做几个版本微信广告投放收费标准
  • 一键网站模块百度小说排行榜2021
  • 中山企业网站制作seo入门基础教程
  • 长沙java网站开发汕头网站建设
  • 怒江北京网站建设加速游戏流畅的软件
  • 宁夏建设工程质量监督站网站搭建网站多少钱
  • 英语网站推广策划书网络推广方法
  • 合肥红酒网站建设百度一下网址是多少
  • 建设部网站网站建设新闻最新消息
  • 企业网站建设电话品牌网站设计
  • 工信部做网站认证吗口碑营销的定义
  • 网站被挂黑链排名降权手机百度网盘登录入口
  • 网站风格类型合肥网络seo推广服务
  • 大学生怎么做网站支付模块广告信息发布平台
  • 免费商城网站源码推广赚钱app哪个靠谱