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

C++ | list

 前言

本篇博客讲解c++STL中的list

💓 个人主页:普通young man-CSDN博客

⏩ 文章专栏:C++_普通young man的博客-CSDN博客

⏩ 本人giee:   普通小青年 (pu-tong-young-man) - Gitee.com

      若有问题 评论区见📝

🎉欢迎大家点赞👍收藏⭐文章

本篇文章主要讲解list的用法和list的代码实现,这个list的用法和vector string的接口用法都差不多,所以我不会讲解太多,如果大家有疑问就去看我以前的博客

目录

list的介绍及使用

 1,介绍

2,使用

list的构造

list iterator的使用

list capacity

list element access

Modifiers:

list模拟实现

解析

1. 基础结构定义

list_node 结构体

2. 迭代器定义

list_iterator 结构体

3. 链表类定义

list 类

4. list 类的成员函数解析

构造与析构

插入与删除

迭代器操作

其他操作

5. 辅助函数

总结

注意事项


list的介绍及使用

 1,介绍

list - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/list/list/?kw=list

  

这里可以看出list是一个双向带环的链表

2,使用

list的接口和我们之前的vector和string的用法差不多,以下我展示一些常见的接口

list的构造

构造函数(list::list - C++ Reference (cplusplus.com))描述
list()构造一个空的 std::list
list(size_type n, const value_type& val = value_type())构造一个包含 n 个值为 val 的元素的 std::list。如果 val 没有显式给出,则使用默认构造的值。
list(const list& x)拷贝构造函数,复制另一个 std::list 实例的内容。
list(InputIterator first, InputIterator last)从输入迭代器范围 [first, last) 构造一个新的 std::list,其中 first 和 last 分别是输入序列的开始和结束迭代器。

演示代码

template <class T>
void Print(const list<T>& tmp) {for (auto it : tmp){cout << it << " ";}cout << endl;
}
void test1() {//list<int> a1{ 1,2,3,4,5,6 };list<int> a1(10, 1);list<int> a2(a1.begin(),a1.end());list<int> a3(10, 2);a1 = a2;Print(a1);Print(a2);Print(a3);}

list iterator的使用

函数声明描述
begin()返回指向列表中第一个元素的双向迭代器。
end()返回指向列表中最后一个元素之后位置的双向迭代器。
rbegin()返回指向列表中最后一个元素的反向迭代器,即正向的 end() 位置。
rend()返回指向列表中第一个元素之前位置的反向迭代器,即正向的 begin() 位置。

演示代码

template <class T>
void Print(const list<T>& tmp) {//auto ch = tmp.begin();auto ch = tmp.begin();while (ch != tmp.end()){cout << *ch << " ";ch++;}for (auto it : tmp){cout << it << " ";}cout << endl;
}

list capacity

函数声明描述
empty()检测 std::list 是否为空。如果列表为空,则返回 true;否则返回 false
size()返回 std::list 中有效节点的个数。

演示代码

void test4() {list<int> a1;a1.push_back(1);a1.push_back(2);a1.push_back(3);if (a1.empty()){cout << "no empty"  << endl;}else{cout << "yes emptyz" << endl;}cout << a1.size() << endl;}

list element access

函数声明描述
front()返回 std::list 的第一个节点中值的引用。
back()

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

Modifiers:

函数声明描述
push_front(val)在 std::list 的首元素前插入值为 val 的新元素。
pop_front()删除 std::list 中的第一个元素。
push_back(val)在 std::list 的尾部插入值为 val 的新元素。
pop_back()删除 std::list 中的最后一个元素。
insert(position, val)在 std::list 的指定位置 position 插入值为 val 的新元素。
erase(position)删除 std::list 中位于 position 的元素。
swap(list)交换当前 std::list 与另一个 std::list 中的所有元素。
clear()清空 std::list 中的所有有效元素。

这些接口以前都使用过,所以这里就不使用了

list的迭代器失效

vector里面insert和erase都会出现迭代器失效的问题,在list里面insert是不会出现迭代器失效的问题,为什么?因为他们不是在一个内存中操作,反之list的erase会出现迭代器失效的问题,因为当释放一个节点的时候指向那个节点的指针变成了野指针。

这里我们先看一下他的返回值是iterator

这边直接报错了

这个迭代器失效我们该如何去解决?

话可以实现一个删除所有的偶数

template <class T>
void Print(const list<T>& tmp) {//auto ch = tmp.begin();auto ch = tmp.begin();while (ch != tmp.end()){cout << *ch << " ";ch++;}cout << endl;for (auto it : tmp){cout << it << " ";}cout << endl;
}void test5() {int arr[] = { 1,2,3,4,5,6,7 };int n = sizeof(arr) / sizeof(arr[0]);list<int> a1(arr,arr+n);auto it = a1.begin();while (it != a1.end()){if (*it % 2 == 0) {a1.erase(it++);//将这个位置传过去之后}else{it++;}}Print(a1);
}

list模拟实现

只实现一些常用接口

#pragma once
#include <cassert>    // 包含断言头文件
#include <iostream>   // 包含输入输出流头文件
#include <initializer_list> // 包含用于初始化列表的头文件using namespace std;namespace yang {// 定义链表节点结构template<class T>struct list_node {T _data;       // 节点中存储的数据list_node<T>* _next; // 指向下一个节点的指针list_node<T>* _prev; // 指向前一个节点的指针// 构造函数,可选地初始化数据list_node(const T& data = T()): _data(data), _next(nullptr), _prev(nullptr) {}};// 迭代器结构template<class T, class Ref, class Ptr>struct list_iterator {typedef list_node<T> Node; // 节点类型的别名typedef list_iterator<T, Ref, Ptr> Self; // 迭代器类型的别名Node* _node; // 指向当前节点的指针// 构造函数,接受一个节点指针list_iterator(Node* node): _node(node) {}// 解引用运算符,返回数据的引用Ref& operator*() {return _node->_data;}// 成员访问运算符,返回指向数据的指针Ptr* operator->() {return &_node->_data;}// 前缀递增运算符,移动到下一个节点Self& operator++() {_node = _node->_next;return *this;}// 后缀递增运算符,移动到下一个节点,并返回旧值Self operator++(int) {Self tmp(*this);_node = _node->_next;return tmp;}// 前缀递减运算符,移动到前一个节点Self& operator--() {_node = _node->_prev;return *this;}// 后缀递减运算符,移动到前一个节点,并返回旧值Self operator--(int) {Self tmp(*this);_node = _node->_prev;return tmp;}// 等于运算符bool operator==(const Self& s) const {return _node == s._node;}// 不等于运算符bool operator!=(const Self& s) const {return _node != s._node;}};// 链表类定义template <class T>class list {public:typedef list_node<T> Node; // 节点类型的别名typedef list_iterator<T, T&, T*> iterator; // 非常量迭代器的别名typedef list_iterator<T, const T&, const T*> const_iterator; // 常量迭代器的别名// 初始化为空链表void empty_init() {_head = new Node;_head->_next = _head;_head->_prev = _head;_size = 0;}// 默认构造函数list() {empty_init();}// 复制构造函数list(const list<T>& ls) {empty_init();for (auto& it : ls)push_back(it);}// 从初始化列表构造list(initializer_list<T> ls) {empty_init();for (auto& it : ls)push_back(it);}// 析构函数~list() {clear();delete _head;_head = nullptr;}// 交换函数void swap(list<T>& ls) {std::swap(_head, ls._head);std::swap(_size, ls._size);}// 赋值运算符,使用交换惯用法list<T>& operator=(list<T> ls) {swap(ls);return *this;}// 清除所有元素void clear() {auto it = begin();while (it != end()) {it = erase(it);}}// 在链表尾部添加元素void push_back(const T& val) {insert(end(), val);}// 在链表头部添加元素void push_front(const T& val) {insert(begin(), val);}// 在指定位置之前插入值iterator insert(iterator pos, const T& val) {Node* cur = pos._node;Node* prev = cur->_prev;Node* newnode = new Node(val);cur->_prev = newnode;newnode->_next = cur;prev->_next = newnode;newnode->_prev = prev;++_size;return iterator(newnode); // 返回指向新插入元素的迭代器}// 移除第一个元素void pop_front() {erase(begin());}// 移除最后一个元素void pop_back() {erase(--end());}// 移除指定位置的元素iterator erase(iterator pos) {Node* cur = pos._node;Node* next = cur->_next;Node* prev = cur->_prev;next->_prev = prev;prev->_next = next;delete pos._node;--_size;return iterator(next); // 返回指向下一个元素的迭代器}// 返回指向链表开始处的迭代器iterator begin() {return iterator(_head->_next);}// 返回指向链表结束处的迭代器iterator end() {return iterator(_head);}// 返回指向链表开始处的常量迭代器const_iterator begin() const {return const_iterator(_head->_next);}// 返回指向链表结束处的常量迭代器const_iterator end() const {return const_iterator(_head);}// 返回链表的大小size_t size() const {return _size;}// 判断链表是否为空bool empty() const {return _size == 0;}private:Node* _head; // 指向头节点的指针size_t _size; // 链表中的元素数量};// 打印容器内元素的函数template <class Container>void Print_t(const Container& tmp) {for (auto ch = tmp.begin(); ch != tmp.end(); ++ch) {std::cout << *ch << " ";}cout << endl;}// 展示使用的函数void func(const list<int>& lt) {Print_t(lt);}// 测试函数void test1() {list<int> lt0({1, 2, 3, 4, 5, 6});list<int> lt1 = {1, 2, 3, 4, 5, 6, 7, 8};const list<int>& lt3 = {1, 2, 3, 4, 5, 6, 7, 8};func(lt0);Print_t(lt1);}
}

解析

以下是您提供的代码的详细解析:

1. 基础结构定义

list_node 结构体

这是链表的基本组成单元,它包含了一个数据成员 _data 和两个指针成员 _next_prev 分别指向链表中的下一个和前一个节点。

template<class T>
struct list_node {T _data;list_node<T>* _next;list_node<T>* _prev;list_node(const T& data = T()): _data(data), _next(nullptr), _prev(nullptr) {}
};

2. 迭代器定义

list_iterator 结构体

这是一个双向迭代器,它允许你从前向后或从后向前遍历链表。迭代器持有指向当前节点的指针 _node

template<class T, class Ref, class Ptr>
struct list_iterator {// ... iterator implementation ...
};

3. 链表类定义

list 类

这是一个模板类,实现了双向链表的基本功能,包括插入、删除、迭代等操作。

template <class T>
class list {// ... list implementation ...
};

4. list 类的成员函数解析

构造与析构
  • 默认构造函数:创建一个空链表。
  • 复制构造函数:通过拷贝另一个 list 对象来创建一个新的 list
  • 从初始化列表构造:通过给定的初始化列表来创建一个新的 list
  • 析构函数:释放链表中的内存资源。
list() {empty_init();
};list(const list<T>& ls) {empty_init();for (auto& it : ls)push_back(it);
};list(initializer_list<T> ls) {empty_init();for (auto& it : ls)push_back(it);
};~list() {clear();delete _head;_head = nullptr;
};
插入与删除
  • push_back:在链表尾部插入一个新元素。
  • push_front:在链表头部插入一个新元素。
  • insert:在给定迭代器的位置插入一个新元素。
  • pop_front:移除链表的第一个元素。
  • pop_back:移除链表的最后一个元素。
  • erase:移除指定迭代器位置的元素。
void push_back(const T& val) {insert(end(), val);
};void push_front(const T& val) {insert(begin(), val);
};iterator insert(iterator pos, const T& val) {// ... implementation details ...
};void pop_front() {erase(begin());
};void pop_back() {erase(--end());
};iterator erase(iterator pos) {// ... implementation details ...
};
迭代器操作
  • begin:返回指向链表开始位置的迭代器。
  • end:返回指向链表结束位置的迭代器(实际上是最后一个节点之后的位置)。
iterator begin() {return _head->_next;
};iterator end() {return _head;
};const_iterator begin() const {return _head->_next;
};const_iterator end() const {return _head;
};
其他操作
  • clear:移除链表中的所有元素。
  • size:返回链表中的元素个数。
  • empty:判断链表是否为空。
  • swap:交换两个链表的内容。
  • operator=:赋值操作符,使用交换惯用法实现。
void clear() {auto it = begin();while (it != end()) {it = erase(it);}
};size_t size() const {return _size;
};bool empty() const {return _size == 0;
};void swap(list<T>& ls) {// ... implementation details ...
};list<T>& operator=(list<T> ls) {swap(ls);return *this;
};

5. 辅助函数

这是一个通用的打印函数,可以用来打印任何实现了迭代器接口的容器。

template <class Container>
void Print_t(const Container& tmp) {// ... implementation details ...
}

总结

该实现提供了一个简单的双向链表,支持基本的操作,如插入、删除、遍历等。它还包含了一些辅助函数,比如 Print_t 用于打印链表内容,以及一个测试函数 test1 来展示如何使用这些功能。

注意事项

  • 代码中有一些注释掉的部分,例如 push_back 的原始实现,这些部分可以根据需要恢复。
  • 代码中没有实现 find 方法,如果需要查找特定元素,可以考虑实现该方法。
  • 代码中使用了 assert.h,但在实际的链表实现中可能不需要,因为没有使用断言的地方。
  • 可以考虑添加更多的安全检查,例如在删除元素时检查迭代器的有效性。

相关文章:

C++ | list

前言 本篇博客讲解cSTL中的list &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&…...

Vue3 v-bind 指令用法

在 Vue 3 中&#xff0c;v-bind 指令用于将表达式的值绑定到 DOM 元素的属性上。这个指令的语法与 Vue 2 相同&#xff0c;但有一些细微的变化和改进。 以下是 Vue 3 中 v-bind 指令的基本用法&#xff1a; 基本用法: <button v-bind:class"{ active: isActive }"…...

通过Go示例理解函数式编程思维

一个孩子要尝试10次、20次才肯接受一种新的食物&#xff0c;我们接受一种新的范式&#xff0c;大概不会比这个简单。-- 郭晓刚 《函数式编程思维》译者 函数式编程(Functional Programming, 简称fp)是一种编程范式&#xff0c;与命令式编程(Imperative Programming)、面向对象编…...

刷题DAY7

三角形面积 题目&#xff1a;已知三角形的边长a&#xff0c;b和从、&#xff0c;求其面积 输入&#xff1a;输入三个实数a&#xff0c;b&#xff0c;c&#xff0c;表示三边长 输出&#xff1a;输出面积&#xff0c;保留三位小数 输入&#xff1a;1 2 2.5 输出&#xff1…...

离线数据开发流程小案例-图书馆业务数据

参考 https://blog.csdn.net/m53931422/article/details/103633452 https://www.cnblogs.com/jasonlam/p/7928179.html https://cwiki.apache.org/confluence/display/Hive/LanguageManualUDF https://medium.com/jackgoettle23/building-a-hive-user-defined-function-f6abe9…...

GPT-5:未来已来,你准备好了吗

GPT-5&#xff1a;未来已来&#xff0c;你准备好了吗&#xff1f; 在人工智能的浩瀚星空中&#xff0c;自然语言处理&#xff08;NLP&#xff09;技术如同璀璨星辰&#xff0c;不断引领着技术革新的浪潮。而在这股浪潮中&#xff0c;OpenAI的GPT&#xff08;Generative Pre-tr…...

白骑士的Matlab教学高级篇 3.2 并行计算

系列目录 上一篇&#xff1a;白骑士的Matlab教学高级篇 3.1 高级编程技术 并行计算是一种通过同时执行多个计算任务来加速程序运行的方法。在MATLAB中&#xff0c;并行计算工具箱&#xff08;Parallel Computing Toolbox&#xff09;提供了丰富的并行计算功能&#xff0c;使用…...

JS中【解构赋值】知识点解读

解构赋值&#xff08;Destructuring Assignment&#xff09;是 JavaScript 中一种从数组或对象中提取数据的简便方法&#xff0c;可以将其赋值给变量。这种语法可以让代码更加简洁、清晰。下面我会详细讲解解构赋值的相关知识点。 1. 数组解构赋值 数组解构赋值允许你通过位置…...

【Pyspark-驯化】一文搞懂Pyspark中对json数据处理使用技巧:get_json_object

【Pyspark-驯化】一文搞懂Pyspark中对json数据处理使用技巧&#xff1a;get_json_object 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; …...

第10章 无持久存储的文件系统 (1)

目录 前言 10.1 proc文件系统 10.1.1 /proc 内容 本专栏文章将有70篇左右&#xff0c;欢迎关注&#xff0c;查看后续文章。 前言 即存在于内存中的文件系统。如&#xff1a; proc&#xff1a; sysfs&#xff1a; 即/sys目录。 内容不一定是ASCII文本&#xff0c;可能是二进…...

如何把命令行创建python虚拟环境与pycharm项目管理更好地结合起来

1. 问题的提出 我在linux或windows下的某个目录如“X”下使用命令行的方式创建了一个python虚拟环境&#xff08;参考文章&#xff09;&#xff0c;对应的目录为myvenv, 现在我想使用pycharm创建python项目myproject&#xff0c;并且利用虚拟环境myvenv&#xff0c;怎么办&…...

keepalived+lvs高可用负载均衡集群配置方案

配置方案 一、配置主备节点1. 在主备节点上安装软件2. 编写配置文件3. 启动keepalived服务 二、配置web服务器1. 安装并启动http服务2. 编写主页面3.配置虚拟地址4. 配置ARP 三、测试 服务器IP&#xff1a; 主负载均衡服务器 master 192.168.152.71备负载均衡服务器 backup 192…...

Azure OpenAI Swagger Validation Failure with APIM

题意&#xff1a;Azure OpenAI Swagger 验证失败与 APIM 问题背景&#xff1a; Im converting the Swagger for Azure OpenAI API Version 2023-07-01-preview from json to yaml 我正在将 Azure OpenAI API 版本 2023-07-01-preview 的 Swagger 从 JSON 转换为 YAML。 My S…...

haproxy高级功能配置

介绍HAProxy高级配置及实用案例 一.基于cookie会话保持 cookie value:为当前server指定cookie值&#xff0c;实现基于cookie的会话黏性&#xff0c;相对于基于 source 地址hash 调度算法对客户端的粒度更精准&#xff0c;但同时也加大了haproxy负载&#xff0c;目前此模式使用…...

XXL-JOB分布式定时任务框架快速入门

文章目录 前言定时任务分布式任务调度 1、XXL-JOB介绍1.1 XXL-JOB概述1.2 XXL-JOB特性1.3 整体架构 2、XXL-JOB任务中心环境搭建2.1 XXL-JOB源码下载2.2 IDEA导入xxljob工程2.3 初始化数据库2.4 Docker安装任务管理中心 3、XXL-JOB任务注册测试3.1 引入xxl-job核心依赖3.2 配置…...

直流电机及其驱动

直流电机是一种将电能转换为机械能的装置&#xff0c;有两个电极&#xff0c;当电极正接时&#xff0c;电机正转&#xff0c;当电极反接时&#xff0c;电机反转。 直流电机属于大功率器件&#xff0c;GPIO口无法直接驱动&#xff0c;需要配合电机驱动电路来操作 TB6612是一款双…...

Java-判断一个字符串是否为有效的JSON字符串

在 Java 中判断一个字符串是否为有效的 JSON 字符串&#xff0c;可以使用不同的库来进行验证。常见的库 包括 org.json、com.google.gson 和 com.alibaba.fastjson 等。这里我将展示如何使用 com.alibaba.fastjson 库来实现一个简单的工具类&#xff0c;用于判断给定的字符串…...

FPGA开发板的基本知识及应用

FPGA开发板是一种专门设计用于开发和测试现场可编程门阵列(Field-Programmable Gate Array, FPGA)的硬件平台。FPGA是一种高度可配置的集成电路&#xff0c;能够在制造后被编程以执行各种数字逻辑功能。FPGA开发板通常包含一个FPGA芯片以及一系列支持电路和接口&#xff0c;以便…...

JVM知识总结(性能调优)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 性能调优 何时进行JVM调优&#xff1f; 遇到以下情况&#xff0c…...

基于Ascend C的Matmul算子性能优化最佳实践

矩阵乘法是深度学习计算中的基础操作&#xff0c;对于提升模型训练和推理速度至关重要。昇腾AI处理器是一款专门面向AI领域的AI加速器&#xff0c;其AI Core采用达芬奇架构&#xff0c;以高性能Cube计算引擎为基础&#xff0c;针对矩阵运算进行加速&#xff0c;可大幅提高单位面…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!

目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...

算术操作符与类型转换:从基础到精通

目录 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符&#xff1a;、-、*、/、% 赋值操作符&#xff1a;和复合赋值 单⽬操作符&#xff1a;、--、、- 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...

CTF show 数学不及格

拿到题目先查一下壳&#xff0c;看一下信息 发现是一个ELF文件&#xff0c;64位的 ​ 用IDA Pro 64 打开这个文件 ​ 然后点击F5进行伪代码转换 可以看到有五个if判断&#xff0c;第一个argc ! 5这个判断并没有起太大作用&#xff0c;主要是下面四个if判断 ​ 根据题目…...