第四天 怎么又迟到了呀 哎啥时候来准时上个课呀

泛型编程 Traits实现,是什么

泛型编程(Generic Programming)是一种通过编写与特定类型无关的代码来实现代码复用和抽象的编程范式。

在C++中,模板(Templates)是实现泛型编程的主要手段。

Traits(特征)是泛型编程中常用的一种技术,

用于在编译时通过类型萃取(Type Traits)提供关于类型的信息

从而实现类型的不同处理方法。

迭代器就是一个指针

迭代器 给算法的 一个接口

什么是容器

在C++中,容器(Containers)是用于存储和管理对象集合的数据结构。C++标准库(Standard Template Library, STL)提供了一组丰富的容器,它们分为几类,每种容器适用于不同的需求。常见的容器类型包括

容器分类

序列(顺序)容器、关联容器和无序容器

序列(顺序)容器:数组队列向量链表

关联(树)

无序:哈希表

复杂度。。。。

模板实例化是可以定制的

偏特化 

部分特化

不能有二义性

默认模板参数

模板的实例化 在编译的时候运行-----

代码膨胀

优化

模板 概述

在C++中,模板(Templates)是一种通用编程工具,允许程序员编写泛型代码,即代码不仅能够处理一种特定的数据类型,而是可以适用于多种不同的数据类型。模板提供了一种在编译时生成代码的机制,根据特定的模板参数生成特定类型的代码实例。

### 主要类型

C++中的模板主要分为函数模板和类模板两种。

#### 函数模板(Function Templates)

函数模板允许定义一个通用函数,其参数和返回类型可以是任意类型。通过函数模板,可以避免为相似但参数类型不同的函数编写多个重复的代码。

```cpp
template <typename T>
T max(T a, T b) {
    return (a > b) ? a : b;
}
```

#### 类模板(Class Templates)

类模板允许定义通用的类,其中成员变量的类型和成员函数的参数类型可以是模板参数。类模板使得类能够操作多种类型的数据,而无需为每种数据类型编写不同的类定义。

```cpp
template <typename T>
class Array {
public:
    Array(int size) : size(size) {
        data = new T[size];
    }

    T& operator[](int index) {
        return data[index];
    }

    ~Array() {
        delete[] data;
    }

private:
    T* data;
    int size;
};
```

### 模板参数

模板参数是在定义模板时指定的类型或值。在模板中,可以定义类型参数(如`typename T`或`class T`)和非类型参数(如整数值)。模板参数使得模板更加灵活,可以适应不同的需求和场景。

```cpp
template <typename T, int size>
class FixedArray {
public:
    FixedArray() {
        data = new T[size];
    }

    T& operator[](int index) {
        return data[index];
    }

    ~FixedArray() {
        delete[] data;
    }

private:
    T* data;
};
```

### 实例化模板

在使用模板时,需要根据具体的类型或值对模板进行实例化。实例化过程发生在编译时,根据模板参数生成相应的代码实例。

#### 函数模板的实例化

```cpp
int main() {
    int a = 5, b = 10;
    double x = 3.5, y = 4.8;
    
    int result1 = max<int>(a, b); // 显式实例化,类型参数为int
    double result2 = max<double>(x, y); // 显式实例化,类型参数为double
    
    return 0;
}
```

#### 类模板的实例化

```cpp
int main() {
    Array<int> intArray(5); // 类模板实例化,类型参数为int
    intArray[0] = 10;
    std::cout << intArray[0] << std::endl;

    Array<double> doubleArray(3); // 类模板实例化,类型参数为double
    doubleArray[0] = 3.14;
    std::cout << doubleArray[0] << std::endl;
    
    return 0;
}
```

### 模板特化

模板特化(Template Specialization)允许为特定的数据类型或值提供定制的实现。可以对模板的一个或多个特定实例进行特化,提供特定类型或值的专门实现。

```cpp
// 类模板的部分特化示例
template <typename T, typename U>
class MyClass {
    // 通用实现
};

template <typename T>
class MyClass<T, int> {
    // 特化实现,当U为int时的特定实现
};

// 函数模板的特化示例
template <typename T>
T max(T a, T b) {
    return (a > b) ? a : b;
}

template <>
const char* max<const char*>(const char* a, const char* b) {
    return (strcmp(a, b) > 0) ? a : b;
}
```

### 使用建议

- **理解模板参数的类型推导**:模板参数可以根据实际参数的类型进行推导,但有时需要显式指定。
- **注意模板的实例化时机**:模板实例化发生在使用时,编译器会根据需要生成相应的代码。
- **避免模板滥用**:虽然模板提供了强大的泛型编程能力,但过度使用模板可能会增加代码复杂性和编译时间。

通过学习和实践,逐步掌握C++模板的使用方法和技巧,能够极大地提高代码的灵活性和重用性。

操作符重载

哎又是自学的一天

要用map来实现,字典数据要用文件存储

什么是泛型函数

泛型函数(Generic Function)是指可以操作不同数据类型的函数

而不需要为每种类型单独编写函数定义。

在C++中,泛型函数通常通过模板(Templates)来实现。

模板函数可以在编译时根据传入的参数类型自动生成相应的函数代码。

其实就是用模板函数来完成啦,所以给出我半独立写的代码

其中出现了小插曲

#include <iostream>
using namespace std;template <typename T>
void swapab(T &a, T &b) {// T t=0;   特别是T t = 0;这一行会导致问题,因为它假定所有类型都可以用0来初始化,但这是不正确的。例如,对于浮点数、指针和自定义类型,这种初始化可能会失败。T t = a;a = b;b = t;}int main() {int a = 5, b = 10;double x = 3.5, y = 4.8;cout<<"Before swap: a = " << a << ", b = " << b << endl;swapab(a, b);cout<<"After swap: a = " << a << ", b = " << b << endl;cout<<"Before swap: x = " << x << ", y = " << y << endl;swapab(x, y);cout<<"After swap: x = " << x << ", y = " << y << endl;return 0;
}

主要问题和修改

其中我对于写法存在浅显认知 我道歉呜呜呜

  1. 错误的变量定义和赋值

    • T &t=0;:你试图创建一个引用,并将其初始化为0,这是非法的。
    • T = &a;T是一个类型名,不能直接赋值。
    • &a = &b;:左值必须是可以修改的变量,不能是引用的地址。
    • &是取得地址啊 啊啊
  2. 正确的变量定义和赋值

    • 使用非引用类型的临时变量 T t 来保存 a 的值

来来来 第二个作业

作业(真的是 善变的男人 又增加内容 不过应该能学到很多)

B.利用映射,实现一个简单的英汉词典,要求输入中文或者英文,给出对应的翻译词汇,如果没有输出默认提示
要求:使用文件保存词典数据。

加分项:

1.能够通过命令行交互添加新的词汇
2.能够将词典排序后输出

我太菜了,还是分解成3个小任务吧

  • 创建词典数据文件
#include <iostream>
#include <fstream>
#include <string>using namespace std;int main(){
// 使用 ofstream 类创建文件:
// 这会创建一个名为 example.txt 的文件。如果文件已存在,它将被覆盖。
ofstream outFile("dict.txt") ;
// ofstream outFile("example.txt");if (!outFile) {cerr << "无法创建文件。" << endl;return 1;
}// 使用 << 运算符将内容写入文件:outFile << "apple,苹果" << endl;
outFile << "banana,香蕉" << endl;
outFile << "orange,橙子" << endl;
outFile << "hello,你好" << endl;
outFile << "world,世界" << endl;// 关闭文件outFile.close();// 提示用户文件创建成功cout << "文件创建并写入成功。" << endl;return 0;
}
  • 读取词典数据文件并加载到映射中
  • 允许用户查询词典

额 这两步直接就完成任务了

#include <iostream>
#include <fstream>
#include <string>
#include <map>
#include <sstream>
using namespace std;// 定义函数loadDictionary
// 不需要返回,函数名字 传入 字符串和文件名 做映射 在字典
// 打开文件进行读取
// 如果无法打开,就报错// 定义词语,显示请输入
// 死循环等待输入
// 查找单词
// 如果没找到 显示没有
// 接着显示输入一个英文和中文词语void load_Dic(const string& filename , map<string, string>&dictionary ){ifstream file(filename);   // 打开文件进行读取if(!file){cerr << "无法打开,就报错" << filename <<endl;return;}string word;cout<<"显示请输入"<<endl;while(getline(file, word)){istringstream iss(word);string eng,chine;if (getline(iss, eng, ',')&& getline(iss, chine)){dictionary[eng] = chine;dictionary[chine] = eng;}}file.close();  // 关闭文件
}// 在main函数中使用loadDictionary函数// 初始化映射
// 告诉系统 文件名是什么
// 加载词典
// 用户输入并翻译
// 死循环等待输入
// 查找单词
// ifint main(){map<string, string>dictionary;string filename = "dict.txt";load_Dic(filename, dictionary);string word;cout<< " input "<< endl;while (cin >>word){// 查找单词auto it = dictionary.find(word);if(it != dictionary.end()){cout<< "translate" << it->second << endl;}else{cout << " no word "<<endl;}cout << "enter a word again:";}return 0;}

来吧 增加 两个功能

这是添加新的词汇

#include <iostream>
#include <fstream>
#include <string>
#include <map>
#include <sstream>
using namespace std;// 传入文件名和字典,读取文件内容并映射到字典中void load_Dic(const string& filename, map<string, string>&dictionary){ifstream file(filename);if(!file){cerr << "can not open" << filename << endl;return;}string line;while(getline(file, line)){istringstream iss(line);string eng, chine;if(getline(iss, eng, ',')&& getline(iss, chine)){dictionary[eng] = chine;dictionary[chine] = eng;}}file.close();
}// save new wordvoid save_Dic(const string&filename, const map<string, string>& dictionary){ofstream file(filename);if(!file){cerr << "can not open" << filename<< "to save" <<endl;return; }for(const auto& entry : dictionary){file << entry.first << "," << entry.second << endl ;}file.close();
}int main(){map<string, string>dictionary;string filename = "dict.txt";load_Dic(filename, dictionary);string word;string y;string command;cout<< " input "<< endl;while (cin >>word){// 查找单词auto it = dictionary.find(word);if(it != dictionary.end()){cout<< "translate" << it->second << endl;}else{cout << " no word "<<endl;cout<< " do u want to add the word";cin >> y ;cout << "请输入一个英文或中文单词或命令(add: 添加新词汇, quit: 退出): ";if( y == "y"){while (cin >> command) {if (command == "add") {string eng, chine;cout << "请输入要添加的英文单词: ";cin >> eng;cout << "请输入要添加的中文翻译: ";cin >> chine;dictionary[eng] = chine;dictionary[chine] = eng; // 双向映射cout << "成功添加新词汇: " << eng << " -> " << chine << endl;save_Dic(filename, dictionary); // 保存词典数据到文件} else if (command == "quit") {break; // 退出循环} else cout << "请输入一个英文或中文单词或命令(add: 添加新词汇, quit: 退出): ";}}}cout << "enter a word again:";}return 0;}

感觉有点小bug,不管了做出来就不错了

最后的附加来啦

#include <iostream>
#include <fstream>
#include <string>
#include <map>
#include <sstream>
#include <algorithm>using namespace std;// 加载词典函数
void load_Dic(const string& filename, map<string, string>& dictionary) {ifstream file(filename);if (!file) {cerr << "无法打开文件: " << filename << endl;return;}string line;while (getline(file, line)) {istringstream iss(line);string eng, chine;if (getline(iss, eng, ',') && getline(iss, chine)) {dictionary[eng] = chine;dictionary[chine] = eng; // 双向映射}}file.close();
}// 保存词典函数
void save_Dic(const string& filename, const map<string, string>& dictionary) {ofstream file(filename);if (!file) {cerr << "无法打开文件: " << filename << " 进行保存" << endl;return;}for (const auto& entry : dictionary) {file << entry.first << "," << entry.second << endl;}file.close();
}// 显示词典并处理用户交互
void displayDictionary(const string& filename) {map<string, string> dictionary;load_Dic(filename, dictionary);string word;string y;string command;cout << "请输入一个英文或中文单词或命令(add: 添加新词汇, quit: 退出): ";while (cin >> word) {auto it = dictionary.find(word);if (it != dictionary.end()) {cout << "翻译: " << it->second << endl;} else {cout << "词典中没有找到该单词。" << endl;cout << "是否要添加该单词? (y/n): ";cin >> y;if (y == "y") {cout << "请输入要添加的英文单词: ";cin >> word;cout << "请输入要添加的中文翻译: ";cin >> command;dictionary[word] = command;dictionary[command] = word; // 双向映射save_Dic(filename, dictionary); // 保存更新后的词典cout << "成功添加新词汇: " << word << " -> " << command << endl;}}// 排序并输出字典cout << "当前词典内容(按照英文单词排序):" << endl;vector<pair<string, string>> sorted_dict(dictionary.begin(), dictionary.end());sort(sorted_dict.begin(), sorted_dict.end());for (const auto& entry : sorted_dict) {cout << entry.first << " -> " << entry.second << endl;}cout << endl << "请输入一个英文或中文单词或命令(add: 添加新词汇, quit: 退出): ";}
}int main() {string filename = "/home/ubuntu2204/桌面/cpp/day04/homework/homework02/dict.txt";displayDictionary(filename);return 0;
}// g++ /home/ubuntu2204/桌面/cpp/day04/homework/homework02/final_version_dictionary.cpp -o final_version_dictionary
// ./final_version_dictionary

结束啦 剩下的作业 enmmm 不想做了 略略略

继续学习

模板元编程(Template Metaprogramming)

是指在编译期间利用C++模板系统进行计算和代码生成的技术。

它的核心思想是将计算推移到编译期间,

通过模板实例化和递归展开等方式

实现复杂的计算和代码生成,以提高程序的性能和灵活性。

模板元编程的特点和用途包括:

  1. 编译期计算:模板元编程允许在编译期进行计算,生成编译期常量或类型。

  2. 泛化和重用:通过模板,可以编写泛化的代码,处理不同类型和参数的情况,避免代码重复。

  3. 性能优化:将计算移至编译期可以提高程序运行时的性能,因为一些计算工作在编译期已经完成。

  4. 元编程技巧:利用模板元编程可以实现各种编译期技巧,如条件编译、递归展开和元编程逻辑等。

模板推理过程的文档意义:

  • 理解模板参数推导:在C++中,模板推导(template deduction)是指编译器根据函数或类模板的使用情况自动推导模板参数的过程。理解模板推导过程有助于开发者确保代码正确地利用了模板的泛化能力,并理解编译器如何根据上下文推断模板参数。

  • 文档化推导过程:编写文档描述模板推导过程有助于团队内部或者未来阅读代码的开发者理解模板的使用方法和限制条件。特别是对于复杂的模板代码,详细的推导过程描述可以作为使用文档,帮助他人更快地理解代码意图和调试模板推导相关的问题。

是真的抽象啊

模板元函数(template metaprogramming)和模板函数(template function)虽然都涉及到C++中的模板机制,但它们的作用和使用场景有所不同。

### 模板函数(Template Function):

- **定义**:模板函数是指通过模板机制定义的函数,可以用于生成针对不同数据类型的函数实例。
  
- **作用**:模板函数允许在不同类型之间重用相同的代码逻辑,提高代码的重用性和灵活性。

- **示例**:下面是一个简单的模板函数示例,实现了交换两个变量的功能:

  ```cpp
  template <typename T>
  void swap(T& a, T& b) {
      T temp = a;
      a = b;
      b = temp;
  }
  ```

- **调用方式**:模板函数的调用是通过传递具体的类型参数来实例化函数,例如 `swap<int>(x, y)` 或者 `swap<double>(x, y)`。

### 模板元函数(Template Metaprogramming):

- **定义**:模板元函数是指利用C++模板系统在编译期间进行计算和生成代码的技术。

- **作用**:模板元函数允许在编译期间执行复杂的计算和生成代码,生成的结果可以是常量表达式、类型信息等。

- **示例**:前面提到的求最大公约数的示例就属于模板元函数的应用,通过模板递归展开在编译期间计算出最大公约数。

  ```cpp
  template <int A, int B>
  struct GCD {
      static constexpr int value = GCD<B, A % B>::value;
  };

  template <int A>
  struct GCD<A, 0> {
      static constexpr int value = A;
  };
  ```

- **调用方式**:模板元函数的结果可以在编译期间通过静态成员或者 constexpr 变量访问,例如 `GCD<24, 36>::value`。

### 主要区别总结:

1. **执行时间**:模板函数在运行时实例化,而模板元函数在编译期间执行。

2. **功能**:模板函数用于生成函数的多个实例,而模板元函数用于在编译期间进行计算和代码生成。

3. **使用场景**:模板函数适用于需要针对不同类型重用相同逻辑的情况,而模板元函数适用于需要在编译期间进行复杂计算或代码生成的场景。

虽然它们都是通过模板机制实现的,但模板函数和模板元函数的设计目的和使用方式不同,开发者在使用时需根据具体需求选择合适的模板形式。

哎 垃圾模板元函数 比元学习都难理解

gpt的简单例子

#include <iostream>// 模板元函数,计算阶乘
template <int N>
struct Factorial {static constexpr int value = N * Factorial<N - 1>::value;
};// 特化模板,基本情况
template <>
struct Factorial<0> {static constexpr int value = 1;
};int main() {constexpr int result = Factorial<5>::value; // 计算5的阶乘std::cout << "Factorial of 5 is: " << result << std::endl;return 0;
}
template <int N>
struct Factorial {static constexpr int value = N * Factorial<N - 1>::value;
};
  • template <int N>:这是一个模板声明,表明后面的结构体 Factorial 是一个接受一个整数类型参数 N 的模板。这个 N 将会在使用时被具体化为一个具体的整数值。

  • struct Factorial { ... }:定义了一个结构体 Factorial,用来计算阶乘。

  • static constexpr int value = N * Factorial<N - 1>::value;:这是模板结构体中的静态成员变量定义。它使用递归方式来计算 N 的阶乘。具体解释如下:

    • Factorial<N - 1>::value:这是一个递归调用,用来计算 (N-1) 的阶乘值。

    • N * Factorial<N - 1>::value:将当前的 N 乘以 (N-1) 的阶乘值,得到 N 的阶乘值。

    • 介绍的好清楚啊

特化模板

template <>
struct Factorial<0> {static constexpr int value = 1;
};

在模板元编程中,我们经常需要为特定的情况提供特殊处理。在阶乘计算中,当 N0 时,阶乘的结果是 1。这种特殊情况可以通过特化模板来处理:

  • template <>:这是一个特化模板的语法,表示我们要为一个特定的模板参数 N 提供一个特殊的定义。

  • struct Factorial<0> { ... }:这是特化模板的定义,它提供了当模板参数 N 等于 0 时的特殊处理。

  • static constexpr int value = 1;:这里直接定义了 Factorial<0> 的静态成员变量 value1,因为 0 的阶乘定义为 1

constexpr

在 C++11 及以后的标准中,constexpr 是一个关键字,用于声明可以在编译期间求值的常量表达式。在模板元编程中,我们经常会用到 constexpr 来确保计算在编译期间进行,以提高性能和效率。

在我们的例子中,使用 constexpr 可以确保我们在编译期间计算出阶乘的结果,并且可以直接将结果用作编译期常量。例如:

constexpr int result = Factorial<5>::value;

这行代码将在编译时期计算出 5 的阶乘值,并将结果存储在 result 中。

模板元编程利用 C++ 的模板机制,在编译期间进行复杂计算和代码生成,以生成常量表达式和类型信息等。虽然初学时可能感觉抽象和复杂,但它提供了强大的编译期计算能力,有助于提高程序的性能和灵活性。

今天终于结束了,要补得太多了,但是好喜欢这种跟大家一起学习的感觉

转眼间就1W个字了

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

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

相关文章

一文入门CMake

我们前几篇文章已经入门了gcc和Makefile&#xff0c;现在可以来玩玩CMake了。 CMake和Makefile是差不多的&#xff0c;基本上是可以相互替换使用的。CMAke可以生成Makefile&#xff0c;所以本质上我们还是用的Makefile&#xff0c;只不过用了CMake就不用再写Makefile了&#x…

【ajax实战05】文章封面发布

一&#xff1a;实现效果 二&#xff1a;实现步骤 1 准备标签结构和样式 html结构样式 <div class"cover"><label for"img">封面&#xff1a;</label><label for"img" class"place"></label><inpu…

CS-隐藏防朔源-数据转发-中间件反向代理-Apache

目录 1、代理机安装Apache: 2、中间件设置转发&#xff1a; 添加代理 3、重启Apache服务 4、CS监听器配置转发机IP 实战情况下还是要准备两台外网服务器. --还是做个中转 1、代理机安装Apache: apt-get install apache2 a2enmod proxy proxy_ajp proxy_balancer proxy_co…

路由(urls)

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 Django的URL路由流程&#xff1a; l Django查找全局urlpatterns变量&#xff08;urls.py&#xff09;。 l 按照先后顺序&#xff0c;对URL逐一匹…

Python 算法交易实验73 QTV200第二步: 数据清洗并写入ClickHouse

说明 先检查一下昨天启动的worker是否正常工作&#xff0c;然后做一些简单的清洗&#xff0c;存入clickhouse。 内容 1 检查数据 from Basefuncs import * # 将一般字符串转为UCS 名称 def dt_str2ucs_blockname(some_dt_str):some_dt_str1 some_dt_str.replace(-,.).re…

【LeetCode】七、树、堆、图

文章目录 1、树结构2、二叉树3、二叉树的遍历4、堆结构&#xff08;Heap&#xff09;5、堆化6、图 1、树结构 节点、根节点、叶子节点&#xff1a; 高度、深度、层三者的示意图&#xff1a; 2、二叉树 相比其他树&#xff0c;二叉树即每个节点最多两个孩子&#xff08;两个分…

Linux高级编程——进程

1.进程的含义? 进程是一个程序执行的过程&#xff0c;会去分配内存资源&#xff0c;cpu的调度 PID, 进程标识符 当前工作路径 chdir umask 0002 进程打开的文件列表 文件IO中有提到 &#xff08;类似于标准输入 标准输出的编号&#xff0c;系统给0&#xff0c;1&#xf…

【UE5.3】笔记5-蓝图类

什么是蓝图类&#xff1a;其实就是C类&#xff0c;只不过是UE封装好的且可以直接拖出来可视化使用。 如何创建蓝图类&#xff1f;蓝图类有哪些&#xff1f; 蓝图类分为基于关卡的&#xff0c;基于Actor的&#xff0c;基于组件Component的。 基于关卡的蓝图类 一个关卡只能有…

涉案财物管理系统|DW-S405系统实现涉案财物科学化管理

随着社会的不断发展&#xff0c;犯罪形式日益复杂&#xff0c;涉案财物的种类和数量也不断增加。传统的涉案财物管理方式已经无法满足现代执法办案的需求。因此&#xff0c;建立一套科学、高效、规范的警用涉案财物管理系统成为公安机关亟待解决的问题。 涉案财物管理系统DW-S…

最近在读《谁说菜鸟不会数据分析 SPSS篇》pdf分享

谁说菜鸟不会数据分析 SPSS篇 《谁说菜鸟不会数据分析&#xff08;SPSS篇&#xff09;》继续采用职场三人行的方式来构建内容&#xff0c;细致梳理了准专业数据分析的常见问题&#xff0c;并且挑选出企业实践中最容易碰到的案例&#xff0c;以最轻松直白的方式来讲好数据分析的…

51单片机看门狗定时器配置

测试环境 单片机型号&#xff1a;STC8G1K08-38I-TSSOP20&#xff0c;其他型号请自行测试&#xff1b; IDE&#xff1a;KEIL C51&#xff1b; 寄存器配置及主要代码 手册中关于看门狗的寄存器描述如下&#xff1a; 启动看门狗&#xff0c;需将B5位EN_WDT置1即可&#xff0c;…

ScheduledThreadPoolExecutor和时间轮算法比较

最近项目中需要用到超时操作&#xff0c;对于不是特别优秀的timer和DelayQueue没有看。 Timer 是单线程模式。如果某个 TimerTask 执行时间很久&#xff0c;会影响其他任务的调度。Timer 的任务调度是基于系统绝对时间的&#xff0c;如果系统时间不正确&#xff0c;可能会出现…

STL中的迭代器模式:将算法与数据结构分离

目录 1.概述 2.容器类 2.1.序列容器 2.2.关联容器 2.3.容器适配器 2.4.数组 3.迭代器 4.重用标准迭代器 5.总结 1.概述 在之前&#xff0c;我们讲了迭代器设计模式&#xff0c;分析了它的结构、角色以及优缺点&#xff1a; 设计模式之迭代器模式-CSDN博客 在 STL 中&a…

Open AI限制来袭?用上这个工具轻松破局!

【导语】近日&#xff0c;AI领域掀起了一场不小的波澜。Open AI宣布&#xff0c;从7月9日起&#xff0c;将对部分地区的开发者实施API调用限制。这一消息对于许多依赖Open AI技术的国内初创团队来说&#xff0c;无疑是一个沉重的打击。 对于这些团队而言&#xff0c;Open AI的A…

关于摄像头模组中滤光片的介绍

1、问题背景 红外截止滤光片&#xff08;IR CUT Filter&#xff09;是应用在摄像头模组中非常重要的一个器件&#xff0c;因人眼与 coms sensor 对光线各波长的响应不同&#xff0c; 人眼看不到红外光&#xff0c;但 sensor 能感应到&#xff08;如下图是某sensor在各波长下的…

使用 SwiftUI 为 macOS 创建类似于 App Store Connect 的选择器

文章目录 前言创建选择器组件使用选择器组件总结前言 最近,我一直在为我的应用开发一个全新的界面,它可以让你查看 TestFlight 上所有可用的构建,并允许你将它们添加到测试群组中。 作为这项工作的一部分,我需要创建一个组件,允许用户从特定构建中添加和删除测试群组。我…

Flutter学习目录

学习Dart语言 官网&#xff1a;https://dart.cn/ 快速入门&#xff1a;Dart 语言开发文档&#xff08;dart.cn/guides&#xff09; 学习Flutter Flutter生命周期 点击跳转Flutter更换主题 点击跳转StatelessWidget和StatefulWidget的区别 点击跳转学习Flutter中新的Navigato…

Linux操作系统通过实战理解CPU上下文切换

前言&#xff1a;Linux是一个多任务的操作系统&#xff0c;可以支持远大于CPU数量的任务同时运行&#xff0c;但是我们都知道这其实是一个错觉&#xff0c;真正是系统在很短的时间内将CPU轮流分配给各个进程&#xff0c;给用户造成多任务同时运行的错觉。所以这就是有一个问题&…

个人网站搭建-步骤(持续更新)

域名申请 域名备案 域名解析 服务器购买 端口转发 Nginx要在Linux上配置Nginx进行接口转发&#xff0c;您可以按照以下步骤进行操作&#xff1a; 安装Nginx&#xff08;如果尚未安装&#xff09;&#xff1a; 使用包管理工具&#xff08;如apt, yum, dnf, 或zypper&#x…

高考志愿不知道怎么填?教你1招,用这款AI工具,立省4位数

高中的岁月&#xff0c;就像一本厚厚的书&#xff0c;我们一页页翻过&#xff0c;现在&#xff0c;终于翻到了最后一页。但这不是结束&#xff0c;这是新的开始&#xff0c;是人生的新篇章。 高考落幕&#xff0c;学子们在短暂的放松后&#xff0c;又迎来了紧张的志愿填报。 “…