news 2026/6/15 18:59:08

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/6/15 14:22:51

电气风电开年连获多项突破 中标、履约及交付多节点告捷

开年启航&#xff0c;电气风电&#xff08;688660.SH&#xff09;以“开局即冲刺”的姿态&#xff0c;接连在项目中标、履约、交付等多个关键节点&#xff0c;用实干与担当绘就“开门红”画卷&#xff0c;为全年高质量发展注入强劲动能。首单告捷&#xff01;中标聊城181.25MW风…

作者头像 李华
网站建设 2026/6/15 14:22:20

8款人体解析镜像测评:M2FP因稳定性成为企业首选

8款人体解析镜像测评&#xff1a;M2FP因稳定性成为企业首选 在当前AI视觉应用快速落地的背景下&#xff0c;人体解析&#xff08;Human Parsing&#xff09; 技术正广泛应用于虚拟试衣、智能安防、动作识别与数字人生成等场景。该技术要求对图像中的人体进行像素级语义分割&…

作者头像 李华
网站建设 2026/6/15 16:00:12

使用M2FP开发智能姿势矫正应用

使用M2FP开发智能姿势矫正应用 &#x1f9e9; M2FP 多人人体解析服务&#xff1a;技术底座与核心能力 在智能健康、运动辅助和人机交互等前沿领域&#xff0c;精准的人体结构理解是实现高级功能的关键前提。传统的姿态估计算法&#xff08;如OpenPose&#xff09;虽然能提取关键…

作者头像 李华
网站建设 2026/6/10 13:28:45

无需CUDA也能跑大模型?M2FP CPU版镜像实现高效推理

无需CUDA也能跑大模型&#xff1f;M2FP CPU版镜像实现高效推理 &#x1f4d6; 项目背景&#xff1a;多人人体解析的现实挑战 在智能安防、虚拟试衣、动作识别和人机交互等应用场景中&#xff0c;精确理解图像中多个人体的语义结构是关键前提。传统目标检测只能框出人物轮廓&a…

作者头像 李华
网站建设 2026/5/30 16:34:37

三大语义分割模型横向对比:M2FP在人体任务中优势明显

三大语义分割模型横向对比&#xff1a;M2FP在人体任务中优势明显 &#x1f4ca; 语义分割技术演进与人体解析挑战 语义分割作为计算机视觉的核心任务之一&#xff0c;目标是为图像中的每个像素分配一个类别标签&#xff0c;实现像素级的理解。近年来&#xff0c;随着深度学习的…

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

M2FP在虚拟主播中的应用:实时形象生成

M2FP在虚拟主播中的应用&#xff1a;实时形象生成 &#x1f31f; 引言&#xff1a;虚拟主播时代的技术需求 随着直播与虚拟内容的爆发式增长&#xff0c;虚拟主播&#xff08;Virtual YouTuber / VTuber&#xff09;已成为数字娱乐的重要组成部分。传统虚拟主播依赖预设3D模型…

作者头像 李华