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

【C++初阶】list的常见使用操作

在这里插入图片描述

👦个人主页:@Weraphael
✍🏻作者简介:目前学习C++和算法
✈️专栏:C++航路
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨


目录

  • 一、list的基本概念
  • 二、list的构造
      • 2.1 默认构造
      • 2.2 拷贝构造函数
      • 2.3 用n个值为val的元素构造
      • 2.4 用迭代区间的元素构造
  • 三、list的迭代器begin + end
  • 四、list的容量操作
      • 4.1 size
      • 4.2 empty
  • 五、list的遍历
      • 5.1 迭代器遍历
      • 5.2 范围for
  • 六、list的获取元素操作
      • 6.1 front
      • 6.2 back
      • 七、list的对容器修改操作
      • 7.1 push_front
      • 7.2 pop_front
      • 7.3 push_back
      • 7.4 pop_back
      • 7.5 insert + 迭代器随机访问问题
      • 7.6 erase + 迭代器失效问题
      • 7.7 swap
      • 7.8 clear
  • 八、其他操作(常见)
      • 8.1 reverse
      • 8.2 sort
      • 8.3 remove
      • 8.4 unique
  • 九、 list与vector的对比

一、list的基本概念

  • 功能:将数据进行链式存储。
  • 链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的。
  • 链表的组成:链表由一系列结点组成。
  • 结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域
  • STL中的链表是一个 双向带头循环链表。这意味着链表中的每个节点都包含指向前一个节点和后一个节点的指针,而头节点和尾节点互相连接形成一个循环。这样的设计使得在链表中插入、删除节点的操作更加高效,同时也提供了双向遍历链表的能力。
  • list的数据域同样可以存储不同数据类型,因此它同样是一个模板容器
    在这里插入图片描述

二、list的构造

2.1 默认构造

list<int> l;

构造空的list对象

在这里插入图片描述

2.2 拷贝构造函数

【函数原型】

list (const list& x)

【代码示例】

#include <iostream>
#include <list>
using namespace std;int main()
{list<int> l1{ 1,2,3,4,5 };cout << "l1:";for (auto x : l1){cout << x << ' ';}cout << endl;// 拷贝构造函数list<int> l2(l1);cout << "l2:";for (auto x : l2){cout << x << ' ';}cout << endl;return 0;
}

【输出结果】

在这里插入图片描述

2.3 用n个值为val的元素构造

【函数原型】

list (size_type n, const value_type& val = value_type())

没有显示给出第二个参数默认为0

【代码示例】

#include <iostream>
#include <list>
using namespace std;int main()
{// 初始化10个'a'list<char> lc(10, 'a');for (auto x : lc){cout << x << ' ';}cout << endl;return 0;
}

【输出结果】

在这里插入图片描述

2.4 用迭代区间的元素构造

【函数原型】

list (InputIterator first, InputIterator last)

注意:迭代区间的范围通常是左闭右开的[first, last)

【代码示例】

#include <iostream>
#include <list>
using namespace std;int main()
{int a[] = { 0,1,2,3,4,5,6,7,8,9 };int size = sizeof(a) / sizeof(a[0]); // 计算元素个数list<int> ll(a, a + size);for (auto x : ll){cout << x << ' ';}cout << endl;return 0;
}

【输出结果】

在这里插入图片描述

三、list的迭代器begin + end

  • begin:返回第一个元素的迭代器
  • end:返回最后一个元素下一个位置的迭代器
    在这里插入图片描述

【代码示例】

#include <iostream>
#include <list>
using namespace std;int main()
{list<int> l4{ 1,2,3 };list<int>::iterator it = l4.begin();while (it != l4.end()){cout << *it << ' ';it++;}cout << endl;return 0;
}

【输出结果】

在这里插入图片描述

四、list的容量操作

4.1 size

功能:返回list中有效节点的个数

【代码示例】

#include <iostream>
#include <list>
using namespace std;int main()
{list<int> l4{ 1,2,3 };cout << "有效节点个数:" << l4.size() << endl;return 0;
}

【输出结果】

在这里插入图片描述

4.2 empty

功能:检测list是否为空,是返回true,否则返回false

【代码示例】

#include <iostream>
#include <list>
using namespace std;int main()
{list<int> l4;if (l4.empty()){cout << "l4是空结点" << endl;}else{cout << "l4不是空结点" << endl;cout << "l4的有效结点" << l4.size() << endl;}return 0;
}

【输出结果】

在这里插入图片描述

五、list的遍历

list本质是链表,不是用连续性空间存储数据的。因此,list是不支持下标访问[]

5.1 迭代器遍历

【代码示例】

#include <iostream>
#include <list>
using namespace std;int main()
{list<char> lc;// 尾插lc.push_back('c');lc.push_back('x');lc.push_back('k');lc.push_back('h');lc.push_back('s');list<char>::iterator it = lc.begin();while (it != lc.end()){cout << *it << ' ';it++;}cout << endl;// 以上代码可以结合成for循环的形式// list<char>::iterator太长可使用autofor (auto it = lc.begin(); it != lc.end(); it++){cout << *it << ' ';}cout << endl;return 0;
}

【输出结果】

在这里插入图片描述

5.2 范围for

由于list支持迭代器,那么就一定支范围for。因为范围for的底层就是迭代器实现的

【代码实现】

#include <iostream>
#include <list>
using namespace std;int main()
{list<char> lc;// 尾插lc.push_back('c');lc.push_back('x');lc.push_back('k');lc.push_back('h');lc.push_back('s');for (auto x : lc){cout << x << ' ';}cout << endl;return 0;
}

【输出结果】

在这里插入图片描述

六、list的获取元素操作

6.1 front

功能:返回list的第一个节点中值的引用。

【代码示例】

#include <iostream>
#include <list>
using namespace std;int main()
{list<int> l5;l5.push_back(1);l5.push_back(2);l5.push_back(3);l5.push_back(4);l5.push_back(5);cout << "第一个结点的值:" <<  l5.front() << endl;return 0;
}

【输出结果】

在这里插入图片描述

6.2 back

功能:返回list的最后一个节点中值的引用。

【代码示例】

#include <iostream>
#include <list>
using namespace std;int main()
{list<int> l5;l5.push_back(1);l5.push_back(2);l5.push_back(3);l5.push_back(4);l5.push_back(5);cout << "最后一个节点的值:" << l5.back() << endl;return 0;
}

【输出结果】

在这里插入图片描述

七、list的对容器修改操作

7.1 push_front

功能:头插

【代码示例】

#include <iostream>
#include <list>
using namespace std;int main()
{list<int> l5;l5.push_back(1);l5.push_back(2);l5.push_back(3);l5.push_back(4);l5.push_back(5);// 头插l5.push_front(100);for (auto x : l5){cout << x << ' ';}cout << endl;return 0;
}

【输出结果】

在这里插入图片描述

7.2 pop_front

功能:头删

【代码示例】

#include <iostream>
#include <list>
using namespace std;int main()
{list<int> l5;l5.push_back(1);l5.push_back(2);l5.push_back(3);l5.push_back(4);l5.push_back(5);l5.pop_front();for (auto x : l5){cout << x << ' ';}cout << endl;return 0;
}

【输出结果】

在这里插入图片描述

7.3 push_back

功能:尾插

【代码示例】

#include <iostream>
#include <list>
using namespace std;int main()
{list<int> l5;l5.push_back(1);l5.push_back(2);l5.push_back(3);l5.push_back(4);l5.push_back(5);for (auto x : l5){cout << x << ' ';}cout << endl;return 0;
}

【输出结果】

在这里插入图片描述

7.4 pop_back

功能:尾删

【代码示例】

#include <iostream>
#include <list>
using namespace std;int main()
{list<int> l5;l5.push_back(1);l5.push_back(2);l5.push_back(3);l5.push_back(4);l5.pop_back();for (auto x : l5){cout << x << ' ';}cout << endl;return 0;
}

【输出结果】

在这里插入图片描述

7.5 insert + 迭代器随机访问问题

vector开始insert都是使用迭代器来访问的

在这里插入图片描述

假设已有数据:1 2 3 4,现要在2后插入100。根据以往所学知识不难可以写出以下代码:

#include <iostream>
#include <list>
using namespace std;int main()
{list<int> l5;l5.push_back(1);l5.push_back(2);l5.push_back(3);l5.push_back(4);l5.insert(l5.begin() + 2, 100);for (auto x : l5){cout << x << ' ';}cout << endl;return 0;
}

【输出结果】

在这里插入图片描述

可惜报错了。

原因是:list本质是链表,不是用连续性空间存储数据的,迭代器也是不支持随机访问的,只能支持++--操作(支持双向遍历)

那可能就有人想,++的底层就是+1,那么为什么+1不行,而++可以?

这都归功于类的封装,在对迭代器封装的时候,重新的定义了这些符号的意义,也就是符号的重载。这才使得我们能就像使用指针一样去使用迭代器。下面是list的源代码(部分)

 self& operator++() { node = (link_type)((*node).next);return *this;}self operator++(int) { self tmp = *this;++*this;return tmp;}
self& operator--() { node = (link_type)((*node).prev);return *this;
}
self operator--(int) 
{ self tmp = *this;--*this;return tmp;
}

【正确写法】

#include <iostream>
#include <list>
using namespace std;int main()
{list<int> l5;l5.push_back(1);l5.push_back(2);l5.push_back(3);l5.push_back(4);auto it = l5.begin();for (int i = 0; i < 2; i++){it++;}l5.insert(it, 100);for (auto x : l5){cout << x << ' ';}cout << endl;return 0;
}

【输出结果】

在这里插入图片描述

接下来我们想,对于insertlist会和vector一样有迭代器失效的问题吗?

答案是没有。原因是:vector在插入时,如果遇到扩容才会存在迭代器失效,而list不存在扩容。

7.6 erase + 迭代器失效问题

功能:删除list position位置的元素

在这里插入图片描述

【代码示例】

目的:删除所有元素

#include <iostream>
#include <list>
using namespace std;int main()
{int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };list<int> l(a, a + sizeof(a) / sizeof(a[0]));cout << "删除前:";for (auto x : l){cout << x << ' ';}cout << endl;auto it = l.begin();while (it != l.end()){l.erase(it);++it;}cout << "删除后:";for (auto x : l){cout << x << ' ';}cout << endl;return 0;
}

【输出结果】

在这里插入图片描述

程序崩了!

这和vector的情况类似,erase()函数执行后,it所指向的节点已被删除,因此it无效。

解决方法:在下一次使用it时,必须先给其赋值

【正确代码】

#include <iostream>
#include <list>
using namespace std;int main()
{int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };list<int> l(a, a + sizeof(a) / sizeof(a[0]));cout << "删除前:";for (auto x : l){cout << x << ' ';}cout << endl;auto it = l.begin();while (it != l.end()){// l.erase(it); 错误it = l.erase(it);}cout << "删除后:";for (auto x : l){cout << x << ' ';}cout << endl;return 0;
}

【输出结果】

在这里插入图片描述

7.7 swap

功能:交换两个list中的元素

#include <iostream>
#include <list>
using namespace std;int main()
{list<int> l1;l1.push_back(1);l1.push_back(1);l1.push_back(1);l1.push_back(1);list<int> l2;l2.push_back(2);l2.push_back(2);l2.push_back(2);l2.push_back(2);cout << "交换前" << endl;cout << "l1:";for (auto x : l1){cout << x << ' ';}cout << endl;cout << "l2:";for (auto x : l2){cout << x << ' ';}cout << endl;l1.swap(l2);cout << "交换后" << endl;cout << "l1:";for (auto x : l1){cout << x << ' ';}cout << endl;cout << "l2:";for (auto x : l2){cout << x << ' ';}cout << endl;return 0;
}

【输出结果】

在这里插入图片描述

7.8 clear

功能:清空list中所有的有效元素

#include <iostream>
#include <list>
using namespace std;int main()
{list<int> l1;l1.push_back(1);l1.push_back(1);l1.push_back(1);l1.push_back(1);l1.clear();if (l1.empty()){cout << "已清空" << endl;}return 0;
}

【输出结果】

在这里插入图片描述

八、其他操作(常见)

在这里插入图片描述

主要讲解画方括号的,剩下的自行了解即可~

8.1 reverse

功能:逆置list

在这里插入图片描述

【代码示例】

#include <iostream>
#include <list>
using namespace std;int main()
{list<char> lc1;lc1.push_back('a');lc1.push_back('b');lc1.push_back('c');lc1.push_back('d');// list的逆置接口lc1.reverse();for (auto x : lc1){cout << x << ' ';}cout << endl;return 0;
}

【输出结果】

在这里插入图片描述

其实list设计这个接口没有必要,因为算法库(algorithm)也设计了reverse算法

在这里插入图片描述

【代码示例】

#include <iostream>
#include <list>
#include <algorithm> // 使用算法库需要包含头文件
using namespace std;int main()
{list<char> lc1;lc1.push_back('a');lc1.push_back('b');lc1.push_back('c');lc1.push_back('d');// 算法库逆置reverse(lc1.begin(), lc1.end());for (auto x : lc1){cout << x << ' ';}cout << endl;return 0;
}

【输出结果】

在这里插入图片描述

8.2 sort

功能:排序list。注意:list底层的sort是归并算法

在这里插入图片描述

【代码示例】

#include <iostream>
#include <list>
using namespace std;int main()
{list<int> ll;ll.push_back(5);ll.push_back(4);ll.push_back(1);ll.push_back(2);ll.push_back(6);ll.push_back(3);ll.sort();for (auto x : ll){cout << x << ' ';}cout << endl;return 0;
}

但是算法库里面也设计了一个sort,但注意:算法库里面的sort对于list是用不了的。

在这里插入图片描述

首先从模板参数上就能发现名字有所不同

事实上,这是因为迭代器从功能上进行了分类。

  • InputIterator就是所有迭代器都可以用。

在这里插入图片描述

  • bidirectional这种迭代器就适合双向的迭代器用。

在这里插入图片描述

  • RadomAccessIterator就适合随机迭代器去使用。
    在这里插入图片描述

因此,由于list适合双向迭代器,所以用不了库里的sort(RadomAccessIterator)

那我们怎么知道一个容器是什么类型的迭代器呢?很简单,查文档就行:点击跳转

这里我为大家总结了一些常见容器的迭代器:

在这里插入图片描述

因此,list接口中实现sort还是有点意义的。我只是说“有点”。

在排序中,vector的排序速度要比list快。这是因为vector是一个连续存储的容器,它的元素在内存中是相邻的,可以利用局部性原理进行高效的排序算法,如快速排序。

相比之下,list是一个链表结构,其元素在内存中是分散存储的,无法直接利用局部性原理,因此排序操作的性能通常较慢。

在某些特定情况下,list可能更适合进行插入和删除操作,因为它对于这些操作的开销较小。因此,在选择容器时,应该根据具体的需求来决定使用哪种容器。

8.3 remove

功能:删除list某个有效数据

在这里插入图片描述

【代码示例】

#include <iostream>
#include <list>
using namespace std;int main()
{list<int> lit;lit.push_back(1);lit.push_back(2);lit.push_back(3);lit.push_back(4);for (auto x : lit){cout << x << ' ';}cout << endl;// 删除4lit.remove(4);for (auto x : lit){cout << x << ' ';}cout << endl;return 0;
}

【输出结果】

在这里插入图片描述

8.4 unique

功能:去重。但是要注意首先得先进行排序,才能进行去重。否则效率极低

在这里插入图片描述

【代码示例】

#include <iostream>
#include <list>
using namespace std;int main()
{list<int> lit;lit.push_back(3);lit.push_back(4);lit.push_back(1);lit.push_back(2);lit.push_back(4);for (auto x : lit){cout << x << ' ';}cout << endl;// 去重lit.sort();lit.unique();for (auto x : lit){cout << x << ' ';}cout << endl;return 0;
}

【输出结果】

在这里插入图片描述

九、 list与vector的对比

vectolist
底层结构动态顺序表,一段连续的空间带头结点的双向循环链表
随机访问支持随机访问,访问某个元素效率O(1)不支持随机访问,访问某个元素
插入和删除任意位置插入和删除效率低,需要搬移元素,时间复杂度为O(N),插入时有可能需要增容,增容:开辟新空间,拷贝元素,释放旧空间,导致效率更低任意位置插入和删除效率高,不需要搬移元素,时间复杂度为O(1)
空间利用率底层为连续空间,不容易造成内存碎片,空间利用率高,缓存利用率高底层节点动态开辟,小节点容易造成内存碎片,空间利用率低,缓存利用率低
迭代器原生态指针对原生态指针(节点指针)进行封装
迭代器失效问题在插入元素时,要给所有的迭代器重新赋值,因为插入元素有可能会导致重新扩容,致使原来迭代器失效,删时,当前迭代器需要重新赋值否则会失效插入元素不会导致迭代器失效,删除元素时,只会导致当前迭代器失效,其他迭代器不受影响
使用场景需要高效存储,支持随机访问,不关心插入删除效率大量插入和删除操作,不关心随机访问

相关文章:

【C++初阶】list的常见使用操作

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…...

排序之插入排序

文章目录 前言一、直接插入排序1、基本思想2、直接插入排序的代码实现3、直接插入排序总结 二、希尔排序1、希尔排序基本思想2、希尔排序的代码实现3、希尔排序时间复杂度 前言 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大…...

c# - - - 安装.net core sdk

如图&#xff0c;安装的是.Net Core 2.2版本 查看安装成功...

Golang Gorm 高级查询之where + find

插入测试数据 package mainimport ("fmt""gorm.io/driver/mysql""gorm.io/gorm" )type Student struct {ID int64Name string gorm:"size:6"Age intEmail *string }func (*Student) TableName() string {return "student&q…...

【LeetCode】30 天 Pandas 挑战

一、笔记 1.对某列进行筛选 df[(df[column1]条件1) | (df[column2]条件2) & (df[column3]条件3)][[columns]]真题&#xff1a; &#xff08;一&#xff09;条件筛选——1.大的国家&#xff08;一&#xff09;条件筛选——2.可回收且低脂的产品&#xff08;一&#xff09;…...

头歌MYSQL——课后作业2 数据表中数据的插入、修改和删除

第1关&#xff1a;数据表中插入一条记录,对指定字段赋值 任务描述 本关任务&#xff1a;在library数据库的reader数据表中插入一条数据 姓名xm为林团团&#xff0c;电话号码dhhm为13507311234&#xff0c;其余字段取默认值 显示数据表的所有数据 为了完成本关任务&#xff0c…...

Maven的profiles多环境配置

一个项目通常都会有多个不同的运行环境&#xff0c;例如开发环境&#xff0c;测试环境、生产环境等。而不同环境的构建过程很可能是不同的&#xff0c;例如数据源配置、插件、以及依赖的版本等。每次将项目部署到不同的环境时&#xff0c;都需要修改相应的配置&#xff0c;这样…...

go 协程

golang中的并发是函数相互独立运行的能力。Goroutines是并发运行的函数。Golang提供了 如何实现go协程 只需要在函数前面加上go即可 go task()package mainimport ("fmt""time" )func show(msg string) {for i : 0; i < 5; i {fmt.Printf("msg: …...

【python爬虫案例】用python爬豆瓣读书TOP250排行榜!

文章目录 一、爬虫对象-豆瓣读书TOP250二、python爬虫代码讲解三、讲解视频四、完整源码 一、爬虫对象-豆瓣读书TOP250 您好&#xff0c;我是 马哥python说 &#xff0c;一名10年程序猿。 今天我们分享一期python爬虫案例讲解。爬取对象是&#xff0c;豆瓣读书TOP250排行榜数…...

Qt中 gui 模块和 widgets 模块的区别

1. gui 模块提供了基本的图形系统抽象层,包括QPaintDevice、QPainter等类,这些类构成了Qt的绘图基础。 2. widgets 模块在 gui 模块的基础上,提供了完整的桌面级用户界面控件,如按钮、列表、滑块等。这些控件继承自更基础的图形类。 3. gui 模块是更底层的图形功能,widgets模…...

feign调用流程

...

15-数据结构-二叉树的遍历,递归和非递归

简介&#xff1a; 本文主要是代码实现&#xff0c;二叉树遍历&#xff0c;递归和非递归&#xff08;用栈&#xff09;。主要为了好理解&#xff0c;直接在代码处&#xff0c;加了详细注释&#xff0c;方便复习和后期默写。主要了解其基本思想&#xff0c;为后期熟练应用…...

最新绕过目标域名CDN进行信息收集技术

绕过目标域名CDN进行信息收集 1&#xff0e;CDN简介及工作流程 CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;的目的是通过在现有的网络架构中增加一层新的Cache&#xff08;缓存&#xff09;层&#xff0c;将网站的内容发布到最接近用户的网…...

overlayfs

参考&#xff1a;How containers work: overlayfs how overlays work Overlay filesystems, also known as “union filesystems” or “union mounts” let you mount a filesystem using 2 directories: a “lower” directory, and an “upper” directory. Basically: t…...

Mysql中九种索引失效场景分析

表数据&#xff1a; 索引情况&#xff1a; 其中a是主键&#xff0c;对应主键索引&#xff0c;bcd三个字段组成联合索引&#xff0c;e字段为一个索引 情况一&#xff1a;不符合最左匹配原则 去掉b1的条件后就不符合最左匹配原则了&#xff0c;导致索引失效 情况二&#xff…...

Android RecyclerView 之 列表宫格布局的切换

前言 RecyclerView 的使用我就不再多说&#xff0c;接下来的几篇文章主要说一下 RecyclerView 的实用小功能&#xff0c;包括 列表宫格的切换&#xff0c;吸顶效果&#xff0c;多布局效果等&#xff0c;今天这篇文章就来实现一下列表宫格的切换&#xff0c;效果如下 一、数据来…...

妈妈的爱依然深沉

村里的孩子为了买化肥&#xff0c;跟城里官老爷们借了好多钱。 那几年庄稼转手很快&#xff0c;不是用来吃的&#xff0c;因此借钱成本很高&#xff0c;大概LPR加100bp。 后来村里孩子终于发现庄稼终究只能用来吃&#xff0c;不再热衷买卖化肥。可是官老爷们的金融生意还要继续…...

net.ResolveTCPAddr(“tcp6“, address)

尝试解析 "www.google.com" 的IPv6地址。如果解析成功&#xff0c;程序将打印出解析后的IP地址、端口以及区域信息。如果解析失败&#xff0c;程序将打印出错误信息。 需要注意的是&#xff0c;如果 "www.google.com" 没有IPv6地址&#xff0c;或者本地网络…...

mysql和mybatisPlus实现:datetime类型的字段范围查询

前提说明 数据库在存储数据时,我们为了精确一下时间,便会把改时间类型的字段设置为datetime类型; 在过滤数据库数据时,我们又需要对该字段进行一个范围的过滤 由此,便出现了这篇博客 datetime数据类型 在MySQL中,datetime数据类型用于保存日期和时间的值。它的格式为Y…...

学习笔记:用ROS接收rosbag发布的topic

用ROS接收 bag.open发布的topic python语言 要使用ROS接收保存在rosbag文件中的话题消息&#xff0c;可以按照以下步骤进行操作&#xff1a; 1.首先&#xff0c;请确保你已经安装了ROS和相关的依赖。 2.创建一个ROS功能包&#xff08;或使用现有的功能包&#xff09;来处理…...

LAMP架构介绍配置命令讲解

LAMP架构介绍配置命令讲解 一、LAMP架构介绍1.1概述1.2LAMP各组件的主要作用1.3各组件的安装顺序 二、编译安装Apache httpd服务---命令讲解1、关闭防火墙&#xff0c;将安装Apache所需的软件包传到/opt/目录下2、安装环境依赖包3、配置软件模块4、编译安装5、优化配置文件路径…...

C语言之函数题

目录 1.乘法口诀表 2.交换两个整数 3.函数判断闰年 4.函数判断素数 5.计算斐波那契数 6.递归实现n的k次方 7.计算一个数的每位之和&#xff08;递归&#xff09; 8.字符串逆序&#xff08;递归实现&#xff09; 9.strlen的模拟&#xff08;递归实现&#xff09; 10.求…...

SpringBoot的四种handler类型

Controller ReuestMapping 实现Controller接口 使用Component将该类封装成一个Bean 实现HttpRequestHandler 实现RouterFunction...

基于KNN算法的鸢尾花种类预测

导入数据 iris_data load_iris() iris_data.data[0:5, :]array([[5.1, 3.5, 1.4, 0.2],[4.9, 3. , 1.4, 0.2],[4.7, 3.2, 1.3, 0.2],[4.6, 3.1, 1.5, 0.2],[5. , 3.6, 1.4, 0.2]])# 特征值名称 iris_data.feature_names[sepal length (cm),sepal width (cm),petal length (cm…...

英语-面试

自我介绍 hi,my name is tzh,26 years old.I major in software engineering. I participate in the design and development of the social project and e-commerce project. I master java and algorithm. Im familiar with gateway,spring,springboot,springcloud,redis…...

文件传输协议

文章目录 一、FTP1. 定义2. 端口3. 数据传输方式主动方式被动方式 二、TFTP三、常用命令 首先可以看下思维导图&#xff0c;以便更好的理解接下来的内容。 一、FTP 1. 定义 文件传输协议&#xff08;FTP&#xff09;是一种用于在客户端和服务器之间进行文件传输的标准网络协…...

Llama-2大模型本地部署研究与应用测试

最近在研究自然语言处理过程中&#xff0c;正好接触到大模型&#xff0c;特别是在年初chatgpt引来的一大波AIGC热潮以来&#xff0c;一直都想着如何利用大模型帮助企业的各项业务工作&#xff0c;比如智能检索、方案设计、智能推荐、智能客服、代码设计等等&#xff0c;总得感觉…...

白嫖idea

白嫖idea 地址 https://www.jetbrains.com/toolbox-app/...

PyCharm切换虚拟环境

PyCharm切换虚拟环境 为了满足不同任务需要不同版本的包&#xff0c;可以在Anaconda或者Miniconda创建多个虚拟环境文件夹&#xff0c;并在PyCharm下切换虚拟环境。 解决方案 1、打开Ananconda Prompt 2、创建自己的虚拟环境 格式&#xff1a;conda create -n 虚拟环境名字…...

自动化运维工具-----Ansible入门详解

目录 一.Ansible简介 什么是Ansible&#xff1f; Ansible的特点 Ansible的架构 二.Ansible任务执行解析 ansible任务执行模式 ansible执行流程 ansible命令执行过程 三.Ansible配置解析 ansible的安装方式 ansible的程序结构&#xff08;yum安装为例&#xff09; ansibl…...