【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;
}
【输出结果】
接下来我们想,对于insert
,list
会和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
功能:清空
lis
t中所有的有效元素
#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的对比
vecto | list | |
---|---|---|
底层结构 | 动态顺序表,一段连续的空间 | 带头结点的双向循环链表 |
随机访问 | 支持随机访问,访问某个元素效率O(1) | 不支持随机访问,访问某个元素 |
插入和删除 | 任意位置插入和删除效率低,需要搬移元素,时间复杂度为O(N),插入时有可能需要增容,增容:开辟新空间,拷贝元素,释放旧空间,导致效率更低 | 任意位置插入和删除效率高,不需要搬移元素,时间复杂度为O(1) |
空间利用率 | 底层为连续空间,不容易造成内存碎片,空间利用率高,缓存利用率高 | 底层节点动态开辟,小节点容易造成内存碎片,空间利用率低,缓存利用率低 |
迭代器 | 原生态指针 | 对原生态指针(节点指针)进行封装 |
迭代器失效问题 | 在插入元素时,要给所有的迭代器重新赋值,因为插入元素有可能会导致重新扩容,致使原来迭代器失效,删时,当前迭代器需要重新赋值否则会失效 | 插入元素不会导致迭代器失效,删除元素时,只会导致当前迭代器失效,其他迭代器不受影响 |
使用场景 | 需要高效存储,支持随机访问,不关心插入删除效率 | 大量插入和删除操作,不关心随机访问 |
相关文章:

【C++初阶】list的常见使用操作
👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:C航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞…...

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

c# - - - 安装.net core sdk
如图,安装的是.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]]真题: (一)条件筛选——1.大的国家(一)条件筛选——2.可回收且低脂的产品(一)…...

头歌MYSQL——课后作业2 数据表中数据的插入、修改和删除
第1关:数据表中插入一条记录,对指定字段赋值 任务描述 本关任务:在library数据库的reader数据表中插入一条数据 姓名xm为林团团,电话号码dhhm为13507311234,其余字段取默认值 显示数据表的所有数据 为了完成本关任务,…...

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

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 您好,我是 马哥python说 ,一名10年程序猿。 今天我们分享一期python爬虫案例讲解。爬取对象是,豆瓣读书TOP250排行榜数…...

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

feign调用流程
...

15-数据结构-二叉树的遍历,递归和非递归
简介: 本文主要是代码实现,二叉树遍历,递归和非递归(用栈)。主要为了好理解,直接在代码处,加了详细注释,方便复习和后期默写。主要了解其基本思想,为后期熟练应用…...

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

overlayfs
参考: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中九种索引失效场景分析
表数据: 索引情况: 其中a是主键,对应主键索引,bcd三个字段组成联合索引,e字段为一个索引 情况一:不符合最左匹配原则 去掉b1的条件后就不符合最左匹配原则了,导致索引失效 情况二ÿ…...

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

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

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

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

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

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

C语言之函数题
目录 1.乘法口诀表 2.交换两个整数 3.函数判断闰年 4.函数判断素数 5.计算斐波那契数 6.递归实现n的k次方 7.计算一个数的每位之和(递归) 8.字符串逆序(递归实现) 9.strlen的模拟(递归实现) 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三、常用命令 首先可以看下思维导图,以便更好的理解接下来的内容。 一、FTP 1. 定义 文件传输协议(FTP)是一种用于在客户端和服务器之间进行文件传输的标准网络协…...

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

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

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

自动化运维工具-----Ansible入门详解
目录 一.Ansible简介 什么是Ansible? Ansible的特点 Ansible的架构 二.Ansible任务执行解析 ansible任务执行模式 ansible执行流程 ansible命令执行过程 三.Ansible配置解析 ansible的安装方式 ansible的程序结构(yum安装为例) ansibl…...