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

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

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.mrgr.cn/news/15431.html

相关文章:

  • 什么是跨域问题?出现的原因和解决方法是什么?
  • 记录一次两台虚拟机Oracle rac 心跳不能建立的排查
  • 【对象存储】MINIO_RELEASE.2024-08-17T01-24-54Z-cpuv1部署与操作
  • 2024.8.26 Python,最大子数和与动态规划,最小路径和,分割回文串,字典序排数,最长重复子数组(动态规划)
  • 斯坦福大学cs231n (图像分类)
  • Android如何高效的加载大型位图
  • 【JVM】执行引擎、JIT、逃逸分析(二)
  • MVC与设计模式理解-lnmp学习之路
  • 如何使用python抓包,附代码
  • 虚拟机Linux(Centos7)系统静态IP设置
  • java 使用intern()性能对比
  • 贪心算法---划分字母区间
  • mysql集群从零开始搭建
  • 怎么解决 hash 碰撞,用 C++ 实现 hashMap?
  • Docker原理及实例
  • 计算机毕业设计选题推荐-医院门诊预约-医院预约挂号微信小程序/安卓APP-项目实战
  • linux:网络编程之TCP
  • day02 1.c++对c的扩充
  • 【ShuQiHere】微调与训练恢复:理解 `load_weights` 和 `save_model` 的实用方法
  • 【Linux入门】shell基础篇——数组