STL容器中 list(双向链表)的增删改查

embedded/2024/11/14 12:24:06/

list(双向链表

std::list 是 C++ 标准模板库(STL)中的一个容器,它实现了一个双向链表。双向链表中的每个元素都包含三个部分:存储数据的元素本身、指向前一个元素的指针(或迭代器)、以及指向后一个元素的指针(或迭代器)。这使得在链表的任何位置进行插入和删除操作都非常高效,因为这些操作只需要改变指针的指向,而不需要移动其他元素。然而,与数组或 std::vector 相比,随机访问元素的速度较慢,因为访问元素需要从头或尾开始遍历链表list支持快速的插入和删除操作,但不支持随机访问。

#include <iostream>  
#include <list>  int main() {  std::list<int> lst;  // 向list中添加元素  lst.push_back(10);  lst.push_front(5);  // 遍历list  for (std::list<int>::iterator it = lst.begin(); it != lst.end(); ++it) {  std::cout << "元素: " << *it << std::endl;  }  // 使用范围for循环遍历list(需要C++11及以后,并包含<initializer_list>)  // 注意:直接的范围for循环不适用于std::list,但可以使用其他方式模拟  return 0;  
}  // 注意:由于list不支持随机访问迭代器,因此不能直接使用范围for循环。  
// 可以通过C++11的auto和基于范围的for循环来遍历list,但通常需要额外的辅助,如std::begin和std::end。

插入元素

向 std::list 中插入元素可以使用 insert 方法。它可以在指定位置之前插入一个新元素,也可以插入一个元素范围。

#include <iostream>  
#include <list>  int main() {  std::list<int> myList = {1, 2, 4};  // 在第二个元素之前插入3  auto it = myList.begin();  std::advance(it, 1); // 移动迭代器到第二个元素  myList.insert(it, 3);  // 遍历并打印  for (int elem : myList) {  std::cout << elem << " ";  }  std::cout << std::endl;  return 0;  
}

删除元素

删除元素可以使用 erase 方法,该方法删除迭代器指向的元素,并返回指向下一个元素的迭代器。

#include <iostream>  
#include <list>  int main() {  std::list<int> myList = {1, 2, 3, 4};  // 删除值为3的元素  for (auto it = myList.begin(); it != myList.end(); ) {  if (*it == 3) {  it = myList.erase(it); // 注意,这里迭代器需要更新  } else {  ++it;  }  }  // 遍历并打印  for (int elem : myList) {  std::cout << elem << " ";  }  std::cout << std::endl;  return 0;  
}

修改元素

修改元素非常简单,直接通过迭代器访问并修改其值。

#include <iostream>  
#include <list>  int main() {  std::list<int> myList = {1, 2, 3, 4};  // 修改第二个元素为10  auto it = myList.begin();  std::advance(it, 1); // 移动到第二个元素  *it = 10;  // 遍历并打印  for (int elem : myList) {  std::cout << elem << " ";  }  std::cout << std::endl;  return 0;  
}

遍历元素

遍历 std::list 可以使用范围基于的for循环(如上面示例所示),或者使用迭代器手动遍历。

#include <iostream>  
#include <list>  int main() {  std::list<int> myList = {1, 2, 3, 4};  // 使用迭代器遍历  for (auto it = myList.begin(); it != myList.end(); ++it) {  std::cout << *it << " ";  }  std::cout << std::endl;  return 0;  
}


http://www.ppmy.cn/embedded/107194.html

相关文章

Python 和 Java 区别是什么?哪个运行效率高?为什么?

一、Python 和 Java 的区别 1. 编程风格 • Python 是一种解释型动态编程语言&#xff0c;语法简洁、灵活&#xff0c;代码较为简洁直观&#xff0c;注重代码的可读性和简洁性&#xff0c;使用缩进来表示代码块。 • Java 是一种编译型静态编程语言&#xff0c;语法相对严谨…

[Leetcode] 接雨水(相向双指针)

可以直接移步大神的解题思路&#xff0c;非常详细 -> 盛最多水的容器 接雨水_哔哩哔哩_bilibili 11. 盛最多水的容器 https://leetcode.cn/problems/container-with-most-water/description/ 42. 接雨水 https://leetcode.cn/problems/trapping-rain-water/description/ 11…

python实现人工蜂群算法

博客目录 引言 什么是人工蜂群算法&#xff08;ABC&#xff09;&#xff1f;人工蜂群算法的应用场景为什么使用人工蜂群算法&#xff1f; 人工蜂群算法的原理 人工蜂群算法的基本概念人工蜂群算法的三种蜜蜂类型人工蜂群算法的流程人工蜂群算法的特点与优势 人工蜂群算法的实…

pytest二次开发:生成用例参数

pytest.fixture是一个装饰器&#xff0c;用于声明一个fixture。Fixture是pytest中的一个核心概念&#xff0c;它提供了一种将测试前的准备代码&#xff08;如设置测试环境、准备测试数据等&#xff09;和测试后的清理代码&#xff08;如恢复测试环境、删除临时文件等&#xff0…

STM32基础篇:RTC × Unix时间戳 × BKP

Unix时间戳 最早是在Unix系统使用的&#xff0c;之后很多由Unix演变而来的系统也都继承了Unix时间戳的规定。目前&#xff0c;Linux、Windows、安卓这些系统&#xff0c;其底层的计时系统都是使用Unix时间戳。 Uinx时间戳&#xff08;Unix Timestamp&#xff09;定义为从UTC/…

扑捉一只耿鬼(HTML文件)

图例&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>耿鬼</title><style>body {background: #fff;font-family: Comfortaa, sans-serif;}* {box-sizing:…

滑动窗口序列(单序列双指针)9/5

一、不间断子数组(滑动窗口哈希表) 题意&#xff1a; 给你一个数组nums,现在求子数组中都有 0 < |nums[i1] - nums[i2]| < 2 。这样称一个不间断子数组。&#xff08;简而言之&#xff1a;子数组中最大值和最小值的差距必须<2&#xff09;。求不间断子数组的数量 输…

Android 14(API 级别 34)中,DexClassLoader 不再支持可写 dex/jar 文件

Android 14&#xff08;API 级别 34&#xff09;中&#xff0c;DexClassLoader 不再支持从可写文件加载 dex/jar 文件。这意味着从Android 14开始&#xff0c;你不能再使用 DexClassLoader 来动态加载位于内部存储中的dex/jar文件&#xff0c;除非这些文件被设置为只读。 解决…