news 2026/4/16 17:04:33

15.C++入门:list|构造|使用|迭代器失效

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
15.C++入门:list|构造|使用|迭代器失效
list的介绍

list的文档介绍

list的构造
构造函数接口说明
list (size_type n, const value_type& val = value_type())构造的 list 中包含 n 个值为 val 的元素
list()构造空的 list
list (const list& x)拷贝构造函数
list (InputIterator first, InputIterator last)用 [first, last) 区间中的元素构造 list
list iterator的使用
函数声明接口说明
begin + end返回第一个元素的迭代器 + 返回最后一个元素下一个位置的迭代器
rbegin + rend返回第一个元素的 reverse_iterator (即 end 位置) + 返回最后一个元素下一个位置的 reverse_iterator (即 begin 位置)

【注意】

  1. begin与end为正向迭代器,对迭代器执行++操作,迭代器向后移动
  2. rbegin(end)与rend(begin)为反向迭代器,对迭代器执行++操作,迭代器向前移动
list capacity
函数声明接口说明
empty检测 list 是否为空,是返回 true,否则返回 false
size返回 list 中有效节点的个数
list element access
函数声明接口说明
front返回 list 的第一个节点中值的引用
back返回 list 的最后一个节点中值的引用
list modifiers
函数声明接口说明
push_front在 list 首元素前插入值为 val 的元素
pop_front删除 list 中第一个元素
push_back在 list 尾部插入值为 val 的元素
pop_back删除 list 中最后一个元素
insert在 list position 位置中插入值为 val 的元素
erase删除 list position 位置的元素
swap交换两个 list 中的元素
clear清空 list 中的有效元素
#include<iostream> #include<list> #include<vector> #include<algorithm> using namespace std; //int main() //{ // list<int> lt; // lt.push_back(1); // lt.push_back(2); // lt.push_back(3); // lt.push_back(4); // lt.push_back(5); // // 迭代器遍历 // list<int>::iterator it = lt.begin(); // while (it != lt.end()) // { // *it += 10; // // cout << *it << " "; // ++it; // } // cout << endl; // // 范围for遍历 // for (auto e : lt) // { // cout << e << " "; // } // cout << endl; // // 逆置 // lt.reverse(); // for (auto e : lt) // { // cout << e << " "; // } // cout << endl; // // return 0; //} void test_op1() { srand(time(0)); const int N = 1000000; list<int> lt1; list<int> lt2; vector<int> v; for (int i = 0; i < N; ++i) { auto e = rand(); lt1.push_back(e); v.push_back(e); } int begin1 = clock(); sort(v.begin(), v.end()); int end1 = clock(); int begin2 = clock(); lt1.sort(); int end2 = clock(); printf("vector sort:%d\n", end1 - begin1); printf("list sort:%d\n", end2 - begin2); } void test_op2() { srand(time(0)); const int N = 1000000; list<int> lt1; list<int> lt2; for (int i = 0; i < N; ++i) { auto e = rand(); lt1.push_back(e); lt2.push_back(e); } int begin1 = clock(); // vector vector<int> v(lt2.begin(), lt2.end()); // sort(v.begin(), v.end()); // lt2 lt2.assign(v.begin(), v.end()); int end1 = clock(); int begin2 = clock(); lt1.sort(); int end2 = clock(); printf("list copy vector sort copy list sort:%d\n", end1 - begin1); printf("list sort:%d\n", end2 - begin2); } //int main() //{ // list<int> lt; // lt.push_back(1); // lt.push_back(4); // lt.push_back(2); // lt.push_back(2); // lt.push_back(2); // lt.push_back(2); // lt.push_back(4); // lt.push_back(3); // // lt.push_back(5); // // for (auto e : lt) // { // cout << e << " "; // } // cout << endl; // // 先排序再去重 // lt.sort(); // lt.unique(); // for (auto e : lt) // { // cout << e << " "; // } // cout << endl; // // //sort(lt.begin(), lt.end()); // test_op2(); // // return 0; //} int main() { // LRU list<int> lt; lt.push_back(1); lt.push_back(2); lt.push_back(3); lt.push_back(4); lt.push_back(5); for (auto e : lt) { cout << e << " "; } cout << endl; // 把2转移到列表的尾部 lt.splice(lt.end(), lt, find(lt.begin(), lt.end(), 2)); for (auto e : lt) { cout << e << " "; } cout << endl; return 0; }
list的迭代器失效

可将迭代器暂时理解成类似于指针,迭代器失效即迭代器所指向的节点的无效,即该节点被删除了。因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。

void TestListIterator1() { int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; list<int> l(array, array+sizeof(array)/sizeof(array[0])); auto it = l.begin(); while (it != l.end()) { // erase()函数执行后,it所指向的节点已被删除,因此it无效,在下一次使用it时,必须先给 其赋值 l.erase(it); ++it; } } // 改正 void TestListIterator() { int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; list<int> l(array, array+sizeof(array)/sizeof(array[0])); auto it = l.begin(); while (it != l.end()) { l.erase(it++); // it = l.erase(it); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 14:49:56

M2FP模型在虚拟主播技术中的应用实践

M2FP模型在虚拟主播技术中的应用实践 背景与需求&#xff1a;虚拟主播场景中的人体解析挑战 随着虚拟现实、直播电商和数字人技术的快速发展&#xff0c;虚拟主播已成为内容创作和品牌营销的重要载体。在这一背景下&#xff0c;如何实现高质量、低延迟的实时人物图像处理成为关…

作者头像 李华
网站建设 2026/4/15 12:10:14

Z-Image-Turbo动态GIF帧图生成可能性探讨

Z-Image-Turbo动态GIF帧图生成可能性探讨 引言&#xff1a;从静态图像到动态表达的技术延伸 阿里通义Z-Image-Turbo WebUI图像快速生成模型&#xff0c;作为基于Diffusion架构优化的高效AI图像生成工具&#xff0c;已在静态图像生成领域展现出卓越性能。其核心优势在于极低推…

作者头像 李华
网站建设 2026/4/13 17:43:15

多人运动分析系统搭建:基于M2FP的关节位置推断方法

多人运动分析系统搭建&#xff1a;基于M2FP的关节位置推断方法 &#x1f4cc; 引言&#xff1a;为何需要高精度多人人体解析&#xff1f; 在智能体育、远程康复训练、动作捕捉与虚拟现实等前沿应用中&#xff0c;对多人运动过程中各关键关节的位置进行精准推断&#xff0c;已成…

作者头像 李华
网站建设 2026/4/16 13:04:20

M2FP性能优化揭秘:ResNet-101骨干网络提升多人检测精度

M2FP性能优化揭秘&#xff1a;ResNet-101骨干网络提升多人检测精度 &#x1f4cc; 引言&#xff1a;为何M2FP在多人人体解析中脱颖而出&#xff1f; 随着智能视觉应用的不断拓展&#xff0c;多人人体解析&#xff08;Multi-person Human Parsing&#xff09;已成为虚拟试衣、…

作者头像 李华
网站建设 2026/4/16 10:34:19

Z-Image-Turbo私有化部署指南:企业内网安全运行配置

Z-Image-Turbo私有化部署指南&#xff1a;企业内网安全运行配置 阿里通义Z-Image-Turbo WebUI图像快速生成模型 二次开发构建by科哥 本文为《Z-Image-Turbo私有化部署指南》完整技术实践手册&#xff0c;聚焦企业级内网环境下的安全、稳定与高效部署方案。涵盖从环境准备、服务…

作者头像 李华
网站建设 2026/4/16 14:12:58

M2FP在AR/VR中的应用:实时人体分割技术

M2FP在AR/VR中的应用&#xff1a;实时人体分割技术 &#x1f9e9; M2FP 多人人体解析服务概述 随着增强现实&#xff08;AR&#xff09;与虚拟现实&#xff08;VR&#xff09;技术的快速发展&#xff0c;实时、精准的人体语义分割已成为构建沉浸式交互体验的核心能力之一。在虚…

作者头像 李华