【C++STL基础入门】list改、查操作

2023-09-20 18:09:16


前言

C++标准模板库(STL)是C++语言中非常重要的部分,它提供了一组通用的模板类和函数,用于处理常见的数据结构和算法问题。其中之一是list(链表),它是一种双向链表容器,提供了高效的插入和删除操作。本文将介绍如何使用C++ STL中的list进行改和查操作。

list的改操作:
在list中进行改操作主要包括插入(Insert)、删除(Erase)和替换(Replace)等操


一、list查操作

1.1 迭代器循环

迭代器循环是一种常见的遍历list的方式。通过使用迭代器,可以逐个访问list中的元素,并进行查找操作。

示例代码:

std::list<int> myList{1, 2, 3, 4, 5};

// 迭代器循环查找元素
for (auto it = myList.begin(); it != myList.end(); ++it) {
    if (*it == 3) {
        // 找到了元素3
        break;
    }
}

在这里插入图片描述

在上面的示例中,我们使用了迭代器遍历list,并通过比较每个元素的值来查找目标元素。当找到目标元素时,我们可以使用break语句退出循环。

1.2 for_each函数

std::for_each()函数是C++ STL提供的一种方便的遍历算法,可以对list中的每个元素应用一个指定的操作。

函数原型:

template<class InputIt, class UnaryFunction>
UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f);
参数解释:

first:指向要遍历的list的起始位置的迭代器
last:指向要遍历的list的结束位置的迭代器
f:要应用于每个元素的操作的函数对象
示例代码:

#include <iostream>
#include <list>
#include <algorithm>

void printElement(int element) {
    std::cout << element << " ";
}

int main() {
    std::list<int> myList{1, 2, 3, 4, 5};

    // 使用for_each函数打印每个元素
    std::for_each(myList.begin(), myList.end(), printElement);

    return 0;
}

在这里插入图片描述

在上面的示例中,我们定义了一个printElement()函数,它将每个元素打印到标准输出。然后我们使用for_each()函数,将printElement()函数作为参数传递进去,对list中的每个元素进行打印操作。

二、list改操作

2.1 迭代器修改

通过使用迭代器,可以修改list中指定位置的元素的值。

示例代码:

std::list<int> myList{1, 2, 3, 4, 5};

// 通过迭代器修改元素的值
auto it = myList.begin();
++it;  // 移动到第二个元素
*it = 10;  // 修改为10

在这里插入图片描述

在上面的示例中,我们通过迭代器定位到list中的第二个元素,然后将其值修改为10。

2.2 assign函数

1、assign(count, value)
函数原型:

void assign(size_type count, const T& value);

参数解释:

count:新元素的个数
value:新元素的值
示例代码:

std::list<int> myList;
myList.assign(5, 10);  // 将5个值为10的元素赋值给myList

在这里插入图片描述

2、assign(first, last)
函数原型:

template <class InputIt>
void assign(InputIt first, InputIt last);

参数解释:

first:指向新元素范围的起始位置的迭代器
last:指向新元素范围的结束位置的迭代器
示例代码:

std::list<int> myList;
std::vector<int> newElements{1, 2, 3, 4, 5};
myList.assign(newElements.begin(), newElements.end());  // 将newElements范围内的元素赋值给myList

在这里插入图片描述

3、assign(std::initializer_list)
函数原型:

void assign(std::initializer_list<T> ilist);

参数解释:

ilist:初始化列表,包含了要赋值给list的元素
示例代码:

std::list<int> myList;
myList.assign({1, 2, 3, 4, 5});  // 将初始化列表中的元素赋值给myList

在这里插入图片描述

这些重载函数使得使用assign函数更加灵活,可以根据不同的需求选择适合的方式来将新的元素范围赋值给list。

2.3 =运算符

当使用=运算符赋值一个list时,会创建一个副本,使得目标list与源list包含相同的元素。废话不多说,上示例代码:

#include <iostream>
#include <list>

int main() {
  std::list<int> sourceList{1, 2, 3, 4, 5};
  std::list<int> targetList;

  targetList = sourceList;  // 使用=运算符赋值

  // 打印目标list的元素
  for (const auto& element : targetList) {
    std::cout << element << " ";
  }
  std::cout << std::endl;

  return 0;
}

在这里插入图片描述

输出:

1 2 3 4 5

在上面的示例中,我们先创建了一个源list sourceList,其中包含了一些整数。然后,我们创建了一个空list targetList。接下来,使用=运算符将源list赋值给目标list。最后,通过遍历目标list中的元素,我们打印出了目标list的元素,验证了赋值操作的正确性。


总结

本文介绍了在C++ STL中使用list进行改和查操作的基本方法。通过插入、删除和替换操作,可以对list的内容进行修改。而通过顺序查找、二分查找和预定义函数等方法,可以从list中查找指定的元素。熟练掌握这些操作可以在实际开发中提高程序的效率和灵活性。建议读者通过进一步学习和练习,深入了解和掌握C++ STL中list的更多特性和用法。

更多推荐

现今主流物联网无线通信技术分类详解

无线技术正在迅速发展,并在人们的生活中发挥越来越大的作用。而随着无线应用的增长,各种技术和设备也会越来越多,也越来越依赖于无线通信技术。本文盘点下物联网中无线通信主要的技术。一、无线通信技术的几大主流分类1.美国通信委员会(FCC)分类2015年,美国通信委员会(FCC,FederalCommunicationsCom

vue若依前端项目搭建

1.项目搭建首先进入到你需要创建的项目目录下面,然后输入命令vuecreate.创建项目接下来选择手动搭建,然后把下面图片中的内容选上再然后继续配置一些参数信息接下来运行npmrunserve项目就启动起来了2.配置登录界面文件首先修改src/router/index.js这个界面,写若依的登录界面先把这一串内容删除掉

Linux 应用程序日志查看命令

目录前言需求命令1.tail命令2.head命令3.cat命令4.sed5.grep命令6.more命令7.less命令前言在工作过程中,需要查看服务端的日志,掌握常用的命令是开发工程师必备的技能,快速的查看到日志,才能精准定位问题所在。需求1.查看日志文件需求主要有以下几个服务启动后跟踪服务日志是否启动正常服务运行过

防火墙基本概念

思维导图1.什么是防火墙?网络在远古时期没有防火墙大家都是联通的,anytoany,没有防火墙的时代就相当于没有门的房子,没有城墙的城市。路由器与交换机的本质是转发,防火墙的本质是控制和防护。防火墙,顾名思义,阻挡的是火,此词起源于建筑领域,正是用来隔离火灾,阻止火势从一个区域蔓延到另一个区域。引入到通信领域,防火墙也

面试中的情商考察:如何展示你的人际理解能力

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🦄博客首页——🐅🐾猫头虎的博客🎐🐳《面试题大全专栏》🦕文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》🐾学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》🐅学会Gol

淘宝分布式文件存储系统( 三 ) -TFS

淘宝分布式文件存储系统(三)->>TFS目录:文件重新映射的接口介绍文件映射mmap_file.cpp的实现进行测试文件重新映射(增加或者减少文件映射区域的大小)mremap()函数的原型如下#include<sys/mman.h>void*mremap(void*old_address,size_told_size,

如何在面试中展示跨领域的能力

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🦄博客首页——🐅🐾猫头虎的博客🎐🐳《面试题大全专栏》🦕文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》🐾学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》🐅学会Gol

嵌入式笔试面试刷题(day15)

文章目录前言一、Linux中的主设备号和次设备号1.查看方法2.主设备号和次设备号的作用二、软件IIC和硬件IIC的区别三、变量的声明和定义区别四、static在C和C++中的区别五、串口总线空闲时候的电平状态总结前言本篇文章继续讲解嵌入式笔试面试刷题,希望大家坚持跟着我的脚步一起加油冲击大厂offer。一、Linux

Pytest单元测试框架 —— Pytest+Allure+Jenkins的应用

一、简介pytest+allure+jenkins进行接口测试、生成测试报告、结合jenkins进行集成。pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高allure-pytest是python的一个第三方库。用于连接py

开始使用Filebeat

认识BeatsBeats是用于单用途数据托运人的平台。它们以轻量级代理的形式安装,并将来自成百上千台机器的数据发送到Logstash或Elasticsearch。(画外音:通俗地理解,就是采集数据,并上报到Logstash或Elasticsearch)Beats对于收集数据非常有用。它们位于你的服务器上,将数据集中在E

嵌入式笔试面试刷题(day12)

文章目录前言一、SDK是什么二、内存分配最小单位三、内联函数和宏函数的区别四、空指针和野指针的区别五、访问野指针和空指针会发生什么六、C++面向对象的三要素七、if(0==x)和if(x==0)八、二维数组地址是否连续总结前言本篇文章继续带大家来刷题,秋招也快到了大家坚持刷题,相信大家都可以找到好工作。一、SDK是什么

热文推荐