STL-函数对象、谓词、常用算法

函数对象

函数对象概念

重载函数调用操作符的类,其对象常称为函数对象

函数对象使用重载的()时,行为类似函数调用,也叫仿函数

本质:

函数对象(仿函数)是一个,不是一个函数

函数对象使用

特点:

  • 函数对象在使用时,可以想普通函数那样调用,可以有参数,可以有返回值
  • 函数对象超出普通函数的概念,函数对象可以有自己的状态
  • 函数对象可以作为参数传递
//函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值
class MyAdd
{
public:int operator()(int a, int b){return a + b;}
};
//函数对象超出普通函数的概念,函数对象可以有自己的状态
class MyPrint
{
public:MyPrint(){this->m_Count = 0;}void operator()(string test){cout << test << endl;m_Count++;}int m_Count;
};
//函数对象可以作为参数传递
void doPrint(MyPrint& mp, string test)
{mp(test);
}
void test01()
{//函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值MyAdd add;cout << add(10, 20) << endl;//函数对象超出普通函数的概念,函数对象可以有自己的状态MyPrint myPrint;myPrint("hello world");myPrint("hello world");myPrint("hello world");myPrint("hello world");myPrint("hello world");cout << "打印次数:" << myPrint.m_Count << endl;//函数对象可以作为参数传递doPrint(myPrint, "hello c++");
}

谓词

谓词概念

返回bool类型仿函数称为谓词

如果operator()接受一个参数,那么叫做一元谓词

如果operator()接受两个参数,那么叫做二元谓词

//返回bool类型的仿函数称为谓词
//一元谓词 - 大于5
class greaterFive
{
public:bool operator()(int val){return val > 5;}
};void test01()
{vector<int>v;for (int i = 0; i < 10; ++i){v.push_back(i);}vector<int>::iterator it = find_if(v.begin(), v.end(), greaterFive());if (it == v.end()){cout << "没找到" << endl;}else{cout << "找到大于5的数为:" << *it << endl;}
}

二元谓词之前已经提过,排序的方式修改

内建函数对象

内建函数对象意义

STL内建了一些函数对象

分类:

算术仿函数

关系仿函数

逻辑仿函数

用法:

这些仿函数所产生的对象,用法和一般函数完全相同

使用内建函数对象,需要引入头文件#include<fucntional>

算术仿函数

功能描述:

实现四则运算

其中negate是一元运算,其他都是二元运算

仿函数类型:

void test01()
{negate<int>n;cout<<n(30)<<endl;plus<int>p;cout<<p(10, 20)<<endl;
}

注意:使用内建函数对象,需要引入头文件#include<fucntional>

关系仿函数

功能描述:

实现关系对比

仿函数原型:

void printVector(vector<int>& v)
{for (vector<int>::iterator it = v.begin(); it != v.end();++it){cout << *it << " ";}cout << endl;
}
class Larger
{
public:bool operator()(int num1, int num2){return num1 > num2;}
};
void test01()
{vector<int>v;v.push_back(10);v.push_back(30);v.push_back(40);v.push_back(20);printVector(v);sort(v.begin(), v.end());printVector(v);//从大到小排序// 方法1. 自定义仿函数// sort(v.begin(), v.end(), Larger());//方法2. 内建关系仿函数sort(v.begin(), v.end(), greater<int>());printVector(v);
}

关系仿函数中最常用的就是greater<>大于

逻辑仿函数

实现逻辑运算

函数原型:

class print02
{
public:void operator()(bool num){cout << num << " ";}
};
class Transform
{
public:int operator()(int num){return num+1;}
};
void test01()
{vector<bool>v;v.push_back(true);v.push_back(false);v.push_back(true);v.push_back(true);for_each(v.begin(), v .end(), print02());cout << endl;//搬运vector<bool>v2; //目标容器v2.resize(v.size()); //目标容器,需要提前开辟空间transform(v.begin(), v.end(), v2.begin(), logical_not<int>());for_each(v2.begin(), v2.end(), print02());cout << endl;
}

STL-常用算法

  • 算法主要是由头文件<algorithm><functional><numeric>组成。
  • <algorithm>是所有STL头文件中最大的一个,范围涉及到比较、交换、查找、遍历操作、复制、修改等等
  • <numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数
  • <functional>定义了一些模板类,用以声明函数对象。

常用遍历算法

for_each //遍历容器

transform //搬运容器到另一个容器中

for_each

函数原型:

//普通函数
void print01(int num)
{cout << num << " ";
}
//仿函数
class print02
{
public:void operator()(int num){cout << num << " ";}
};
void test01()
{vector<int>v;v.push_back(10);v.push_back(40);v.push_back(30);v.push_back(20);//遍历算法for_each(v.begin(), v.end(), print01);cout << endl;for_each(v.begin(), v.end(), print02());
}
transform

函数原型:

class Transform
{
public:int operator()(int num){return num+1;}
};
void test01()
{vector<int>v;v.push_back(10);v.push_back(40);v.push_back(30);v.push_back(20);//搬运vector<int>v2; //目标容器v2.resize(v.size()); //目标容器,需要提前开辟空间transform(v.begin(), v.end(), v2.begin(), Transform());for_each(v2.begin(), v2.end(), print02());cout << endl;
}

常用查找算法

算法简介

find

功能描述:查找指定元素,找到返回指定元素的迭代器,找不到返回结束迭代器end()

函数原型:

void test01()
{vector<int>v;v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(14);for_each(v.begin(), v .end(), print02());cout << endl;vector<int>::iterator it = find(v.begin(), v.end(), 20);if (it == v.end()){cout << "没有找到" << endl;}else{cout << "找到了:" << *it << endl;}
}
class Person
{
public:Person(string name, int age){m_Name = name;m_Age = age;}bool operator==(const Person& p){if (this->m_Name == p.m_Name && this->m_Age == p.m_Age){return true;}else{return false;}}string m_Name;int m_Age;
};
void test02()
{vector<Person>v;Person p1("top", 10);Person p2("as", 32);Person p3("bob", 43);Person p4("tony", 38);v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);Person pp("as", 32);vector<Person>::iterator it = find(v.begin(), v.end(), pp);if (it == v.end()){cout << "没找到" << endl;}else{cout << "找到了,姓名:" << it->m_Name << ",年龄:" << it->m_Age << endl;}
}
find_if

功能描述:

按条件查找元素

函数原型:

class greaterFive
{
public:bool operator()(int val){return val > 15;}
};
void test01()
{vector<int>v;v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(14);for_each(v.begin(), v .end(), print02());cout << endl;vector<int>::iterator it = find_if(v.begin(), v.end(), greaterFive());if (it == v.end()){cout << "没有找到" << endl;}else{cout << "找到了:" << *it << endl;}
}
class Person
{
public:Person(string name, int age){m_Name = name;m_Age = age;}bool operator==(const Person& p){if (this->m_Name == p.m_Name && this->m_Age == p.m_Age){return true;}else{return false;}}string m_Name;int m_Age;
};
class greater20
{
public:bool operator()(const Person& p){return p.m_Age > 20;}
};
void test02()
{vector<Person>v;Person p1("top", 10);Person p2("as", 32);Person p3("bob", 43);Person p4("tony", 38);v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);Person pp("as", 32);vector<Person>::iterator it = find_if(v.begin(), v.end(), greater20());if (it == v.end()){cout << "没找到" << endl;}else{cout << "找到了,姓名:" << it->m_Name << ",年龄:" << it->m_Age << endl;}
}
adjacent_find

查找相邻重复元素

函数原型:

void test01()
{vector<int>v;v.push_back(10);v.push_back(20);v.push_back(10);v.push_back(30);v.push_back(14);v.push_back(14);vector<int>::iterator it = adjacent_find(v.begin(), v.end());if (it == v.end()){cout << "未找到" << endl;}else{cout << "已找到:" << *it << endl;}  
}
binary_search

查找指定元素是否存在

函数原型:

void test01()
{vector<int>v;for (int i = 0; i < 10; ++i){v.push_back(i);}bool judge = binary_search(v.begin(), v.end(), 4);if (judge){cout << "找到了" << endl;}else{cout << "未找到" << endl;}
}

注意:二分查找法查找效率虽然高,但查找的容器中元素必须是有序序列

count

统计元素个数

函数原型:

void test01()
{vector<int>v;v.push_back(12);v.push_back(34);v.push_back(32);v.push_back(4);v.push_back(12);v.push_back(12);int sum = count(v.begin(), v.end(), 12);cout << "12有" << sum << "个" << endl;}
class Person
{
public:Person(string name, int age){m_Name = name;m_Age = age;}bool operator==(const Person& p){if (this->m_Age == p.m_Age){return true;}else{return false;}}string m_Name;int m_Age;
};void test02()
{vector<Person>v;Person p1("top", 10);Person p2("as", 32);Person p3("bob", 32);Person p4("tony", 38);v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);Person pp("sq", 32);int sum = count(v.begin(), v.end(), pp);cout << "与sq同岁的人有" << sum << "个" << endl;
}
count_if
void test01()
{vector<int>v;v.push_back(12);v.push_back(34);v.push_back(32);v.push_back(4);v.push_back(16);v.push_back(12);int sum = count_if(v.begin(), v.end(), greaterFive());cout << "大于5有" << sum << "个" << endl;
}
class Person
{
public:Person(string name, int age){m_Name = name;m_Age = age;}string m_Name;int m_Age;
};
class AgeGreater20
{
public:bool operator()(const Person&p){return p.m_Age > 20;}
};
void test02()
{vector<Person>v;Person p1("top", 10);Person p2("as", 32);Person p3("bob", 32);Person p4("tony", 38);Person p5("pig", 43);v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);v.push_back(p5);Person pp("sq", 32);int sum = count_if(v.begin(), v.end(), AgeGreater20());cout << "大于20的人有" << sum << "个" << endl;
}

常用排序算法

sort

函数原型:

class print02
{
public:void operator()(int num){cout << num << " ";}
};
class greaterInt
{
public:bool operator()(int a, int b){return a > b;}
};
void test01()
{vector<int> v;v.push_back(10);v.push_back(30);v.push_back(40);v.push_back(20);v.push_back(50);sort(v.begin(), v.end());//升序for_each(v.begin(), v.end(), print02());cout << endl;//降序//sort(v.begin(), v.end(), greater<int>());sort(v.begin(), v.end(), greaterInt());for_each(v.begin(), v.end(), print02());cout << endl;
}
random_shuffle

洗牌,指定范围内的元素随机调整次序

函数原型:

void test01()
{srand((unsigned int)time(NULL));vector<int> v;for (int i = 0; i < 10; ++i){v.push_back(i);}for_each(v.begin(), v.end(), print02());cout << endl;//利用洗牌算法 打乱顺序random_shuffle(v.begin(), v.end());for_each(v.begin(), v.end(), print02());cout << endl;
}

random_shuffle洗牌算法较实用,记得加随机种子

merge

两个有序的容器元素合并,并存储到另一容器中

合并之后的容器依旧是有序的

函数原型:

reverse

反转元素

函数原型:

void test01()
{srand((unsigned int)time(NULL));vector<int> v;for (int i = 0; i < 10; ++i){v.push_back(i);}for_each(v.begin(), v.end(), print02());cout << endl;reverse(v.begin(), v.end());for_each(v.begin(), v.end(), print02());cout << endl;
}

常用拷贝和替换算法

copy

copy(v.begin(), v.end(), v2.begin());

void test01()
{srand((unsigned int)time(NULL));vector<int> v;vector<int> v2;for (int i = 0; i < 10; ++i){v.push_back(i);}for_each(v.begin(), v.end(), print02());cout << endl;v2.resize(v.size());copy(v.begin(), v.end(), v2.begin());for_each(v2.begin(), v2.end(), print02());cout << endl;
}
replace

void test01()
{srand((unsigned int)time(NULL));vector<int> v;for (int i = 0; i < 10; ++i){v.push_back(i);}v.push_back(2);v.push_back(2);for_each(v.begin(), v.end(), print02());cout << endl;replace(v.begin(), v.end(), 2, 200);//将所有2改为200for_each(v.begin(), v.end(), print02());cout << endl;
}
replace_if

函数原型:

void test01()
{srand((unsigned int)time(NULL));vector<int> v;for (int i = 0; i < 10; ++i){v.push_back(i);}v.push_back(2);v.push_back(2);for_each(v.begin(), v.end(), print02());cout << endl;replace_if(v.begin(), v.end(), greaterFive(), 6);//将所有大于5的改为6for_each(v.begin(), v.end(), print02());cout << endl;
}
swap

函数原型:

常用算术生成算法

算法生成算法属于小型算法,使用时包含头文件#include<numeric>

accumulate

计算区间内 容器元素累计总和

函数原型:

#include<numeric>
void test01()
{vector<int> v;for (int i = 0; i <= 100; ++i){v.push_back(i);}//参数3是其实累加值int total = accumulate(v.begin(), v.end(), 0); //5050total = accumulate(v.begin(), v.end(), 1000);//6050//for_each(v.begin(), v.end(), print02());cout << total<< endl;
}
fill

向容器中填充指定的元素

函数原型:

void test01()
{vector<int>v;v.resize(10);//初始化10个0fill(v.begin(), v.end(), 100);//将0重新填充为100
}

常用集合算法

set_intersection

交集:

例:

v1: 0 1 2 3 4 5 6 7 8 9 10

v2: 5 6 7 8 9 10 11 12 13 14 15

交集: 5 6 7 8 9 10

两个集合必须是有序序列!!

void test01()
{vector<int> v;vector<int> v2;for (int i = 0; i <= 10; ++i){v.push_back(i);v2.push_back(i+5);}vector<int>vTarget;//目标容器需要提前开辟空间//最特殊情况也是占用空间最大情况:大容器包含小容器,//故开辟空间时取最小容器的sizevTarget.resize(min(v.size(), v2.size()));//获取交集//返回目标容器的最后一个元素的迭代器地址	vector<int>::iterator itEnd = set_intersection(v.begin(), v.end(), v2.begin(), v2.end(), vTarget.begin());for_each(vTarget.begin(), itEnd, print02());cout << endl;
}
set_union

求集合并集

例:

v1: 0 1 2 3 4 5 6 7 8 9 10

v2: 5 6 7 8 9 10 11 12 13 14 15

并集: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

void test01()
{vector<int> v;vector<int> v2;for (int i = 0; i <= 10; ++i){v.push_back(i);v2.push_back(i+5);}for_each(v.begin(), v.end(), print02());cout << endl;for_each(v2.begin(), v2.end(), print02());cout << endl;vector<int>vTarget;//目标容器需要提前开辟空间//最特殊情况也是占用空间最大情况:两个容器没有交集,//并集就是两个容器size相加vTarget.resize(v.size()+v2.size());//获取并集vector<int>::iterator itEnd = set_union(v.begin(), v.end(), v2.begin(), v2.end(), vTarget.begin());for_each(vTarget.begin(), itEnd, print02());cout << endl;
}
set_difference

差集

例:

v1: 0 1 2 3 4 5 6 7 8 9 10

v2: 5 6 7 8 9 10 11 12 13 14 15

v1和v2容器的差集: 0 1 2 3 4

v2和v1容器的差集:11 12 13 14 15

void test01()
{vector<int> v;vector<int> v2;for (int i = 0; i <= 10; ++i){v.push_back(i);v2.push_back(i+5);}for_each(v.begin(), v.end(), print02());cout << endl;for_each(v2.begin(), v2.end(), print02());cout << endl;vector<int>vTarget;//目标容器需要提前开辟空间//最特殊情况也是占用空间最大情况:两个容器没有交集,//差集就是两个容器中大的size作为目标容器开辟空间vTarget.resize(max(v.size(), v2.size()));//获取v1和v2的差集cout << "v1和v2的差集为:" << endl;vector<int>::iterator itEnd = set_difference(v.begin(), v.end(), v2.begin(), v2.end(), vTarget.begin());for_each(vTarget.begin(), itEnd, print02());cout << endl;cout << "v2和v1的差集为:" << endl;itEnd = set_difference(v2.begin(), v2.end(), v.begin(), v.end(), vTarget.begin());for_each(vTarget.begin(), itEnd, print02());cout << endl;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/86133.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式单片机上练手的小型图形库

大家好&#xff0c;今天分享一款小型的图形库。 Tiny Graphics Library&#xff1a; http://www.technoblogy.com/show?23OS 这个小型图形库提供点、线和字符绘图命令&#xff0c;用于 ATtiny85 上的 I2C 128x64 OLED 显示器. 它通过避免显示缓冲器来支持RAM有限的处理器&…

tcpdump常用命令

需要安装 tcpdump wireshark ifconfig找到网卡名称 eth0, ens192... tcpdump需要root权限 网卡eth0 经过221.231.92.240:80的流量写入到http.cap tcpdump -i eth0 host 221.231.92.240 and port 80 -vvv -w http.cap ssh登录到主机查看排除ssh 22端口的报文 tcpdump -i …

银行家算法——C语言实现

算法思路 将操作系统看作是银行家&#xff0c;操作系统所拥有的资源就相当于银行家所拥有的资产&#xff0c;进程向操作系统申请资源就相当于资产家向银行贷款&#xff0c;规定资产家在向银行贷款之前&#xff0c;先申明其所贷数额的最大值&#xff0c;申明之后其贷款的数额不…

数据结构与算法-时间复杂度与空间复杂度

数据结构与算法 &#x1f388;1.概论&#x1f52d;1.1什么是数据结构&#xff1f;&#x1f52d;1.2什么是算法&#xff1f; &#x1f388;2.算法效率&#x1f52d;2.1如何衡量一个算法的好坏&#xff1f;&#x1f52d;2.2算法的复杂度&#x1f52d;2.3时间复杂度&#x1f4d6;2…

软件设计师考试学习2

数据结构与算法基础 数组 稀疏矩阵 用代入法计算&#xff0c;A 数据结构的定义 非线性结构分为树和图&#xff0c;区别在于有没有环路 顺序表与链表 引入头节点可以使所有的节点处理方式一致 如果没有空的头节点&#xff0c;头节点需要单独处理 顺序存储与链式存储 查找…

AI-Chat,一款集全网ai功能的应用(附下载链接)

AI-Chat是一款综合性的聊天机器人&#xff0c;集成了多种先进的模型和功能。它采用了GPT4.0、联网版GPT和清华模型等多种模型&#xff0c;使得其具备更强大的语言处理能力。同时&#xff0c;AI-Chat还融合了AI绘画模型&#xff0c;例如Stable Diffusion绘画、文生图、图生图、艺…

基于下垂控制的并网逆变器控制MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 主要模块&#xff1a; 建议使用MATLAB2021b及以上版本打开&#xff01; 功率计算模块、下垂控制模块、电压电流双环控制模块、虚拟阻抗压降模块 扰动设置&#xff1a; 在0.5秒到2秒始端设置0.25Hz的电网频…

手机上网流程解析

来看一个手机开机之后上网的流程&#xff0c;这个过程称为 Attach。可以看出来&#xff0c;移动网络还是很复杂的。因为这个过程要建立很多的隧道&#xff0c;分配很多的隧道 ID&#xff0c;所以我画了一个图来详细说明这个过程。 1、手机开机以后&#xff0c;在附近寻找基站 e…

Hadoop源码阅读(三):HDFS上传

说明&#xff1a; 1.Hadoop版本&#xff1a;3.1.3 2.阅读工具&#xff1a;IDEA 2023.1.2 3.源码获取&#xff1a;Index of /dist/hadoop/core/hadoop-3.1.3 (apache.org) 4.工程导入&#xff1a;下载源码之后得到 hadoop-3.1.3-src.tar.gz 压缩包&#xff0c;在当前目录打开Pow…

2023华为杯数学建模竞赛E题

一、前言 颅内出血&#xff08;ICH&#xff09;是由多种原因引起的颅腔内出血性疾病&#xff0c;既包括自发性出血&#xff0c;又包括创伤导致的继发性出血&#xff0c;诊断与治疗涉及神经外科、神经内科、重症医学科、康复科等多个学科&#xff0c;是临床医师面临的重要挑战。…

Python之网络编程

一、网络编程 互联网时代,现在基本上所有的程序都是网络程序,很少有单机版的程序了。 网络编程就是如何在程序中实现两台计算机的通信。 Python语言中,提供了大量的内置模块和第三方模块用于支持各种网络访问,而且Python语言在网络通信方面的优点特别突出,远远领先其他语…

KT142C语音芯片flash型用户如何更新固件的说明_V2

目录 一、简介 2.1 让芯片进入PC模式 2.2 双击提供的exe程序即可 一、简介 正常的情况下&#xff0c;用户肯定是不需要更新固件的&#xff0c;因为芯片出厂默认就烧录了对应的程序固件&#xff0c;但是有客户可能需要小修小改&#xff0c;或者订制一下某些功能&#xff0c…

Linux设备驱动之Camera驱动

Linux设备驱动之Camera驱动 Camera&#xff0c;相机&#xff0c;平常手机使用较多&#xff0c;但是手机的相机怎么进行拍照的&#xff0c;硬件和软件&#xff0c;都是如何配合拍摄到图像的&#xff0c;下面大家一起来了解一下。 基础知识 在介绍具体Camera框架前&#xff0c…

Linux——进程

目录 一、基本概念 二、描述进程-PCB &#xff08;一&#xff09;task_struct-PCB的一种 &#xff08;二&#xff09;task_ struct内容分类 三、查看进程 &#xff08;一&#xff09;利用ps命令 &#xff08;二&#xff09; 通过 /proc 系统文件夹查看 &#xff08;三…

停车场系统源码

源码下载地址&#xff08;小程序开源地址&#xff09;&#xff1a;停车场系统小程序&#xff0c;新能源电动车充电系统&#xff0c;智慧社区物业人脸门禁小程序: 【涵盖内容】&#xff1a;城市智慧停车系统&#xff0c;汽车新能源充电&#xff0c;两轮电动车充电&#xff0c;物…

zemaxMIF曲线图

调制传递函数&#xff08; Modulation Transfer Function&#xff0c;MTF &#xff09;是用来形容光学系统成像质量的重要指标。 通过对光学系统像空间进行傅里叶变换&#xff0c;可以得到一张分析图表&#xff0c;来描述像面上对比度和空间频率之间的对应关系。 对比度&…

C/C++统计满足条件的4位数个数 2023年5月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C统计满足条件的4位数个数 一、题目要求 1、编程实现 2、输入输出 二、解题思路 1、案例分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 C/C统计满足条件的4位数个数 2019年12月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 给定若干…

numpy 和 tensorflow 中的各种乘法(点乘和矩阵乘)

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程&#xff0c;尽在下方&#xff0c;赶紧点击了解吧~ python源码、视频教程、插件安装教程、资料我都准备好了&#xff0c;直接在文末名片自取就可 点乘和矩阵乘…

【深度学习实验】前馈神经网络(三):自定义多层感知机(激活函数logistic、线性层算Linear)

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 构建数据集 2. 激活函数logistic 3. 线性层算子 Linear 4. 两层的前馈神经网络MLP 5. 模型训练 一、实验介绍 本实验实现了一个简单的两层前馈神经网络 激活函数…

Linux 链表示例 LIST_INIT LIST_INSERT_HEAD

list(3) — Linux manual page 用Visual Studio 2022创建CMake项目 * CmakeLists.txt # CMakeList.txt : Top-level CMake project file, do global configuration # and include sub-projects here. # cmake_minimum_required (VERSION 3.12)project ("llist")# I…