news 2026/2/25 14:01:07

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/2/13 8:57:25

16.C++入门:list|手撕list|反向迭代器|与vector对比

list的模拟实现 list.h #pragma once #include<assert.h>namespace bit {template<class T>struct ListNode{ListNode<T>* _next;ListNode<T>* _prev;T _data;ListNode(const T& x T()):_next(nullptr),_prev(nullptr),_data(x){}};template<c…

作者头像 李华
网站建设 2026/2/13 13:54:29

轻量级模型也能高性能?M2FP CPU推理速度优化揭秘

轻量级模型也能高性能&#xff1f;M2FP CPU推理速度优化揭秘 &#x1f4d6; 项目背景&#xff1a;多人人体解析的现实挑战 在智能安防、虚拟试衣、人机交互等应用场景中&#xff0c;多人人体解析&#xff08;Human Parsing&#xff09; 是一项关键的视觉理解任务。它要求模型…

作者头像 李华
网站建设 2026/2/23 15:40:09

成功案例|如何进行岗位价值评估?——华恒智信助力某国有数智化中心薪酬改革实例

【客户行业】 人工智能、大数据、国有企业、技术服务、研发中心、数智化转型、高科技行业【问题类型】 岗位价值评估、薪酬体系设计、绩效考核体系搭建、宽带薪酬设计、核心人才激励方案、国有企业薪酬激励方案、人力资源体系诊断与优化【客户背景】某国有数智化中心是行业领头…

作者头像 李华
网站建设 2026/2/25 13:37:04

M2FP模型在智能交通监控中的应用:行人分析

M2FP模型在智能交通监控中的应用&#xff1a;行人分析 &#x1f9e9; M2FP 多人人体解析服务 在智能交通系统&#xff08;ITS&#xff09;日益智能化的今天&#xff0c;对道路参与者——尤其是行人的精细化感知能力成为提升交通安全与管理效率的关键。传统目标检测方法仅能提供…

作者头像 李华
网站建设 2026/2/13 5:47:55

M2FP模型在舞台艺术中的应用:实时特效生成

M2FP模型在舞台艺术中的应用&#xff1a;实时特效生成 &#x1f3ad; 舞台艺术与AI视觉的融合新范式 在当代舞台表演中&#xff0c;视觉表现力已成为决定艺术感染力的核心要素之一。从传统灯光布景到数字投影&#xff0c;再到AR增强现实&#xff0c;技术不断推动舞台美学的边界…

作者头像 李华