【头歌Educoder】国防科大 模板与 STL

news2026/5/20 22:25:13
第1关初识模板函数任务目的本关目的编写你的第一个模板函数。编程要求本题的要求为编写模板函数template typename T, int n int getIndex (T a[], T x)返回长度为 n 的数组 a 中 x 第一个出现的位置下标—— 若 x 在 a 中没有出现则返回 -1。测试说明请在代码的 /******* begin ******/ 和 /******* end ******/ 之间完成getIndex函数。平台会对你编写的代码进行测试。例如若char ac[] {x, u, v, x};则调用getIndexchar, 4(ac, u)的返回值为1。开始你的任务吧祝你成功#include iostream using namespace std; template typename T, int n int getIndex(T a[], T x){ /******* begin ******/ for(int i0;in;i){ if(a[i]x){ return i; } } /******* end ******/ return -1; } void output(){ char ac[] {x, u, v, x}; int ai[] {35, 12, 26, 11, 38}; bool ab[] {0, 1, 0, 0}; int id; cin id; switch (id){ case 0: char c; cin c; cout getIndexchar,4(ac, c)endl; break; case 1: int i; cin i; cout getIndexint, 5(ai, i) endl; break; case 2: bool b; cin b; cout getIndexbool, 4(ab, b) endl; break; default: cout -1endl; break; } } int main(int argc, char** argv){ output(); return 0; }第2关模板化 output() 函数任务描述本关任务将上一步的 output() 函数模板化。在上一个关卡中的文件里函数void output(){ char ac[] {x, u, v, x}; int ai[] {35, 12, 26, 11, 38}; bool ab[] {0, 1, 0, 0}; int id; cin id; switch (id){ case 0: char c; cin c; cout getIndexchar,4(ac, c)endl; break; case 1: int i; cin i; cout getIndexint, 5(ai, i) endl; break; case 2: bool b; cin b; cout getIndexbool, 4(ab, b) endl; break; default: cout -1endl; break; } }用于根据情况对 getIndex 进行调用。然而这个函数不具备任何灵活性并且包含了非常多的“冗余”成分。任务目标将上述函数改造为模板化的版本template typename T, int nN void output();其中N 是预定义的常量。请在/***** begin ***/ 与 /**** end *****/ 之间补全代码实现对getIndex() 函数的调用。注意事项假设测试用例中 T 只会例化为基本数据类型如 int、char、bool等。开始你的任务吧祝你成功#include iostream using namespace std; #define N 10 template typename T, int n int getIndex(T a[], T x){ for(int i0; in; i) if (a[i] x) return i; return -1; } template typename T, int nN void output(){ T aT[N]; for(int i0; in; i) cin aT[i]; T x; cin x; /***** begin ***/ cout getIndexT, n(aT, x) endl; /**** end *****/ } int main(int argc, char** argv){ outputint(); return 0; }第3关模板化 Stack 类任务描述本关任务将 Stack 类模板化。相关知识在前面单元的实训关卡中我们曾经实现过堆栈Stack类其声明如下class Stack{ public: Stack(); Stack (unsigned int); Stack (const Stack); ~Stack(); public: bool pop(); // 弹栈操作 bool push(int); // 压栈操作 int readTop() const; // 读栈顶元素 bool isEmpty() const; // 判断栈是否为空 private: int * data; // 存储栈数据的数组 unsigned int top; // 栈顶元素下标 unsigned int size; // 栈的最大容量 public: static unsigned int objNum; static unsigned int defSize; } ;但是这个 Stack 类只能以整数为元素。现在我们需要对其进行“模板化”让它支持任意的数据类型。注意事项请在 /****** header begin *****/ 与 /****** header end *******/ 之间书写 StackT 的类定义在 /****** body begin ******/ 和 /****** body end *******/ 之间书写其对应的方法实现。开始你的任务吧祝你成功#include iostream using namespace std; /****** header begin *****/ template typename T class Stack { public: Stack(); Stack(unsigned int); Stack(const StackT); ~Stack(); public: bool pop(); // 弹栈操作 bool push(T); // 压栈操作 T readTop() const; // 读栈顶元素 bool isEmpty() const; // 判断栈是否为空 private: T * data; // 存储栈数据的数组 unsigned int top; // 栈顶元素下标 (指向下一个可用位置) unsigned int size; // 栈的最大容量 public: static unsigned int objNum; static unsigned int defSize; }; /****** header end *******/ templatetypename T unsigned int StackT::objNum 0; templatetypename T unsigned int StackT::defSize 20; /****** body begin ******/ template typename T StackT::Stack() { size defSize; data new T[size]; top 0; objNum; } template typename T StackT::Stack(unsigned int s) { size s; data new T[size]; top 0; objNum; } template typename T StackT::Stack(const StackT other) { size other.size; data new T[size]; top other.top; for (unsigned int i 0; i top; i) { data[i] other.data[i]; } objNum; } template typename T StackT::~Stack() { delete[] data; objNum--; } template typename T bool StackT::pop() { if (isEmpty()) { return false; // 栈为空弹栈失败 } top--; return true; } template typename T bool StackT::push(T val) { if (top size) { return false; // 栈已满压栈失败 } data[top] val; top; return true; } template typename T T StackT::readTop() const { // 假设调用时栈不为空返回栈顶元素 return data[top - 1]; } template typename T bool StackT::isEmpty() const { return top 0; } /****** body end *******/ int main(int argc, char** argv){ Stackint s; for(int i0; i5; i){ int n; cin n; s.push(n); } for(int i0; i5; i){ couts.readTop()endl; s.pop(); } return 0; }第4关模板化 DynArray 类任务描述本关任务将 DynArray 类模板化。问题回顾在之前单元的实训中曾经将动态数组DynArray类改进至如下形式class DynArray { friend ostream operator(ostream , const DynArray ); public: DynArray(); virtual ~DynArray(); protected: struct ArrayEle { int val; ArrayEle* next; }; private: ArrayEle * m_head; ArrayEle * m_tail; ArrayEle * position(int) const; public: int count() const; void add(int); void insert(int, int); void remove(int); int operator[](int); int operator[](int) const; void clear(); };这个版本的DynArray已经非常完备了但唯一的缺憾是只能封装以整数为元素的数组。现在需要对其进行模板提升使其可以支持任意的元素类型。相关知识这个改造还是据有一定难度的。它的类声明是这样的template typename T class DynArray { public: DynArray(); virtual ~DynArray(); protected: struct ArrayEle { T val; ArrayEle * next; }; private: ArrayEle* m_head; ArrayEle* m_tail; ArrayEle* position(int) const; public: int count() const; void add(const T ); void insert(int, const T ); void remove(int); void clear(); T operator[](int); T operator[](int) const; };如大家见到的那样我们并没有将 operator 作为友元函数置于类声明中。这是一个非常复杂的问题 —— 建议大家查阅关于模板类与友元的相关知识这里不做过多介绍 —— 如果一定要将其声明为友元函数那么建议将该函数的定义写在类声明的内部以保证编译通过。这里有一个需要大家特别注意的地方实现 DynArrayT::position(int) const 方法时其正确的语法是什么呢嗯有些复杂其函数定义为template typename T typename DynArrayT::ArrayEle* DynArrayT::position(int pos) const { ... }因为我们需要显式的告诉编译器DynArrayT::ArrayEle 一定是一个嵌套类的名字。你的任务给出DynArrayT所有方法请在/******** begin **********/和/******** end **********/之间完成以及template typename T ostream operator(ostream os, const DynArrayT arr)函数的实现请在两个/****************************/之间完成—— operator 的要求同前将动态数组的全部元素置于 [ 和 ] 之间输出且元素之间用 ; 分隔。开始你的任务吧祝你成功#include iostream using namespace std; template typename T class DynArray { public: DynArray(); virtual ~DynArray(); protected: struct ArrayEle { T val; ArrayEle * next; }; private: ArrayEle* m_head; ArrayEle* m_tail; ArrayEle* position(int) const; public: int count() const; void add(const T ); void insert(int, const T ); void remove(int); void clear(); T operator[](int); T operator[](int) const; }; /******** begin **********/ template typename T DynArrayT::DynArray() : m_head(nullptr), m_tail(nullptr) {} // 析构函数清空内存 template typename T DynArrayT::~DynArray() { clear(); } // 定位函数返回指定位置的节点指针核心嵌套类型必须加typename template typename T typename DynArrayT::ArrayEle* DynArrayT::position(int pos) const { // 位置非法返回空 if (pos 0 || pos count()) { return nullptr; } ArrayEle* p m_head; // 遍历到目标位置 for (int i 0; i pos; i) { p p-next; } return p; } // 统计元素个数 template typename T int DynArrayT::count() const { int num 0; ArrayEle* p m_head; while (p ! nullptr) { num; p p-next; } return num; } // 尾部添加元素 template typename T void DynArrayT::add(const T value) { // 创建新节点 ArrayEle* newNode new ArrayEle; newNode-val value; newNode-next nullptr; // 空链表头尾都指向新节点 if (m_head nullptr) { m_head newNode; m_tail newNode; } else { // 非空尾节点后追加更新尾指针 m_tail-next newNode; m_tail newNode; } } // 指定位置插入元素 template typename T void DynArrayT::insert(int pos, const T value) { int total count(); // 位置非法直接返回 if (pos 0 || pos total) { return; } ArrayEle* newNode new ArrayEle; newNode-val value; // 插入头部 if (pos 0) { newNode-next m_head; m_head newNode; // 原链表为空同步更新尾指针 if (total 0) { m_tail newNode; } } else { // 找到前驱节点 ArrayEle* pre position(pos - 1); newNode-next pre-next; pre-next newNode; // 插入尾部更新尾指针 if (pos total) { m_tail newNode; } } } // 删除指定位置元素 template typename T void DynArrayT::remove(int pos) { int total count(); // 位置非法直接返回 if (pos 0 || pos total) { return; } ArrayEle* delNode nullptr; // 删除头节点 if (pos 0) { delNode m_head; m_head m_head-next; // 只剩一个节点清空尾指针 if (total 1) { m_tail nullptr; } } else { // 找到前驱节点 ArrayEle* pre position(pos - 1); delNode pre-next; pre-next delNode-next; // 删除尾节点更新尾指针 if (pos total - 1) { m_tail pre; } } // 释放内存 delete delNode; } // 清空所有元素 template typename T void DynArrayT::clear() { ArrayEle* p m_head; while (p ! nullptr) { ArrayEle* temp p; p p-next; delete temp; } // 头尾指针置空 m_head nullptr; m_tail nullptr; } // 非const下标运算符返回引用支持修改 template typename T T DynArrayT::operator[](int pos) { return position(pos)-val; } // const下标运算符返回值只读 template typename T T DynArrayT::operator[](int pos) const { return position(pos)-val; } /******** end **********/ template typename T ostream operator(ostream os, const DynArrayT arr){ /****************************/ os [; int len arr.count(); for (int i 0; i len; i) { if (i ! 0) { os ;; } os arr[i]; } os ]; /****************************/ } int main(int argc, char** argv){ int v; DynArrayint da; for(int i0; i6; i){ cin v; da.add(v); } cin v; da.insert(2,v); da.remove(3); cout daendl; return 0; }第5关模板的特化与偏特化任务描述本关任务掌握模板的特化与偏特化。相关知识“凡事都有特例”程序设计中的普遍规律。对于某些模板类存在“过于宽泛”的问题 —— 某些方法针对一般模板参数如T的实现未必适用于某些特定的参数类型。考虑下面的例子假设有按照如下方式声明的类templatetypename T class Spec{ private: T value; public: Spec(const T ); ~Spec(); public: bool operator(const Spec) const; };它对算符 进行了重载 —— 只有两个 SpecT 对象的 value 成员相同时才返回真1。然而这对于T为char*的情况是不适用的因为我们希望当两个Specchar* 对象的value指向字符串内容相同时即返回真而无需要求value对应的地址相同。此时需要对 SpecT 类进行特化即对 Specchar* 进行特殊处理。特化时需要按如下方式进行类声明template // 取消模板参数 class Specchar*{ private: char* value; public: Spec(char *); ~Spec(); public: bool operator(const Specchar*); };接下来你需要实现Specchar*类的各个方法请在/**********begin ********/ 和 /********** end ********/之间完成。此外模板参数还存在“偏特化”也成为“部分特化”的概念。偏特化分为两种情况第一类模板中含有多个类型参数将某些类型参数固定为特定类型第二将类模板中的类型参数限制为某种特定形式如指针等。 关于模板类的偏特化问题感兴趣的同学可以进一步查阅相关资料。开始你的任务吧祝你成功#include iostream using namespace std; templatetypename T class Spec{ private: T value; public: Spec(const T ); ~Spec(); public: bool operator(const Spec) const; }; templatetypename T SpecT::Spec(const T t){ this-value t; } templatetypename T SpecT::~Spec(){ } templatetypename T bool SpecT::operator (const Spec s) const { return this-value s.value; } #includestring.h template class Specchar*{ private: char* value; public: Spec(char *); ~Spec(); public: bool operator(const Specchar*); }; /**********begin ********/ Specchar*::Spec(char * str) { value new char[strlen(str) 1]; strcpy(value, str); } Specchar*::~Spec() { delete[] value; } bool Specchar*::operator(const Specchar* s) { return strcmp(value, s.value) 0; } /********** end ********/ #define LEN 10 int main(int argc, char** argv) { int u, v; cin u; cinv; Specint spec1(u); Specint spec2(v); char s[LEN]; char t[LEN]; cin s; cint; Specchar* s1(s); Specchar*s2(t); cout (spec1 spec2)endl; cout (s1s2)endl; return 0; }第6关STL 中的容器与迭代器任务描述本关任务掌握 STL 中若干标准容器和迭代器的使用。相关知识STL标准模板库是 C 源码中重要组成部分。它包括一系列模板化的容器container、迭代器iterator、算法algorithm等组件。本关主要关注前两方面。总体来说STL 中的容器可以分为两大类型 —— 序列式容器与关联式容器。序列式容器的元素中存在一个线性序该线性序由元素插入的顺序决定关联式容器的每个元素通过特定的key对其进行索引。STL中的容器主要包括如下几种类型vector头文件为vector序列式容器逻辑上表示一个大小可变的数组支持元素的随机访问与动态增删list相应头文件为 list序列式容器也是一个可变长数组但是其插入/删除元素的操作效率较高随机访问的效率反而低一些deque声明于deque头文件中序列式容器它的逻辑结构与前面两个容器一样但它却结合了二者的优点set/multiset头文件为set关联式容器逻辑结构为一个集合其中 multiset 允许元素的重复map/multimap头文件为 map关联式容器为“名-值key-value对”的集合其中 multimap 允许 key 重复。事实上序列式容器可以看作以连续整数值下表为 key 的 map而 set 可以看作 元素的 key 和 value 相同的 map。除了上述标准容器还存在如下类型的“适配器”stack定义于 stack中先进后出的序列式容器是堆栈的逻辑实现queue/priority_queue定义于queue中先进先出的序列式容器表示队列其中 priority_queue 可以自定义优先级。标准容器存在一些通用的操作如元素的插入与删除、元素的查找与遍历等。一般采用与容器类型兼容的迭代器对其中元素进行遍历。如 vectorT::iterator 就是vectorT类对应的迭代器类型。在 STL 中可以使用容器的begin() end() rbegin() rend()四个成员函数获得指向起始、结尾、逆向起始、逆向结尾处的迭代器。在 C17 之后的标准中上述四个方法被提升为 std 名字空间的函数将其作用在容器上可直接获得相应的迭代器。迭代器都重载了 * 或者 - 算符因此可以当作指针使用。比如下面的代码就可完成 vector 容器的遍历vectorint vec; ... for(vectorint::iterator it vec.begin(); it !vec.end(); it) { cout *itendl; }或者在支持 C17 标准及以上的编译器中可简化为for(auto it std::begin(vec); it!std::end(vec); it){ cout *itendl; }对于 map 的迭代器可以用 -first 和 -second 指向序偶的 key 与 value。事实上还可以避开迭代器进一步简化为for(auto i: vec) // 或 for(int i: vec) cout i endl;具体任务今天的任务比较简单计算一个二元关系的对称闭包。在数学上一个二元关系是一个二元序偶的集合而在 C 中专门为序偶设置了pair 和 tuple 容器。比如pairint, char(3,a); pairint, int(3,5);就构造了两个匿名的二元偶也可以用make_pair这个泛型函数构造二元偶。如果 R 是一个二元关系则其对称闭包 s(R) 定义为其余的我想就不需要作额外介绍了。请在 /****************** begin *******************/和/****************** end *******************/之间补全代码。开始你的任务吧祝你成功#include iostream #include map #include set using namespace std; template typename T setpairT,T sym_closure(const setpairT, T s){ /****************** begin *******************/ setpairT, T res; for (const auto p : s) { res.insert(p); } for (const auto p : s) { res.insert({p.second, p.first}); } return res; /****************** end *******************/ } templatetypename T void output(const setpairint, int s){ for(auto p: s){ cout (p.first,p.second)endl; } } int main(int argc, char** argv){ int n; setpairint, int r; for(cinn; n; n--){ int u, v; cin u v; r.insert(make_pair(u,v)); } auto sr sym_closure(r); outputpairint,int(sr); return 0; }第7关STL 算法与函数对象任务目的本关目的掌握 STL 的算法与函数对象相关知识STL 中除包含了若干模板化的容器、迭代器、适配器等还内置了若干通用模板算法—— 使用这些算法时需要引入头文件 algorithm。下面罗列了一些常用算法accumulate()返回某范围内元素之和这些元素对应的类必须重载 算符copy()对元素进行复制count()对某范围内元素进行统计返回其数目count_if()是 count 的带条件版本返回某些元素中满足特定条件的数目find()在特定范围内对元素进行查找find_if()是 find() 的带条件版本只在特定范围内满足特定条件的元素中进行查找binary_search()顾名思义二分查找sort()对某范围内的元素进行排序...在上面的介绍中多次提到“某范围”三个字具体是什么呢答案就是大部分 STL算法的前两个参数都是两个相同类型的迭代器这个“范围”就由这两个迭代器确定。看下面这个例子vectorint v {12, 34, 22, 18, 6}; sort(v.begin(), v.end()); for(int i0; i5; i) coutv[i]endl;则其依次输出 6、12、18、22、34 —— 我们发现在缺省的情况下它会按照“从小到大”的顺序对v中的元素进行排序。大家可能会有这样的问题如果需要将 v 中的元素按照“从大到小”的顺序派列应当如何做更一般的情况假设 v 中的元素不是整数无法比较大小那 sort() 的结果是什么样的呢这两个都是非常好的问题 —— 它引出了我们下面一个知识点。事实上 sort() 的一般形式形如sort(iter_beg, iter_end, pred)这第三个参数 pred 可以视为一个“二元谓词”—— sort(begin(v), end(v), pred) 调用完成后会使得 pred(v[i],v[i1]) 均成立。那么这个 pred 是什么呢它一般是一个“函数对象”functional object—— 一个函数对象就是某个重载了 ()函数调用算子的对象。比如如果有下面的类声明templatetypename T class Comparator{ public: bool operator() (const T ,const T); };那么每个 Comparator 类的实例都可以看作是一个二元函数对象 —— 换言之每个 Comparator 的实例都可以充当前面的 pred 参数。任务描述完善 Comparator 类使得将 Comparatordouble 的对象作为 sort() 的第三个参数传入时能够将容器假设模板参数为double中的元素按绝对值从大到小排序。请在 /**************begin***********/ 和 /**************end***********/两处之间完成代码。开始你的任务吧祝你成功#includeiostream #include vector #includealgorithm #include cmath using namespace std; template typename T class Comparator { /**************begin***********/ public: bool operator () (const T a, const T b){ return fabs(a)fabs(b); } /**************end***********/ }; int main(int argc, char** argv){ vectordouble vd; int n; // number of elements of vd; for(cin n; n; n--){ double d; cin d; vd.push_back(d); } /**************begin***********/ // sort vd here sort(vd.begin(), vd.end(), Comparatordouble()); /**************end***********/ for(double d: vd) cout d endl; return 0; }

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…