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

news2024/11/15 12:56:09

泛型编程 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函数

// 初始化映射
// 告诉系统 文件名是什么
// 加载词典
// 用户输入并翻译
// 死循环等待输入
// 查找单词
// if


int 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 word

void 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.coloradmin.cn/o/1869812.html

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

相关文章

计算机组成原理——系统总线

题目:计算机使用总线结构便于增减外设,同时__C____。 A.减少了信息传送量 B.提高了信息传输速度 C.减少了信息传输线的条数 1. 总线的分类 1.1. 片内总线 芯片内部的总线 在CPU芯片内部,寄存器与寄存器之间、寄存器与逻辑单元ALU之间 1.1.1. 数据总线 双向传输总线 数…

欢乐钓鱼大师攻略:卡鱼骨、典藏鱼、藏宝图怎么钓?

《欢乐钓鱼大师》是一款以钓鱼为核心玩法的休闲模拟手游&#xff0c;通过逼真的画面和丰富的钓鱼体验吸引了大量玩家。本文将为你详细介绍这款游戏的亮点、常见问题以及一些实用的游戏技巧&#xff0c;帮助你在《欢乐钓鱼大师》中获得更愉快的游戏体验。 辅助工具 1. 辅助工具…

OSM数据导入至PostgreSQL

好几年没写博客了&#xff0c;最近博士小论文扩展准备添加个路网数据增加定位准确性 用的读取代码是github上的代码&#xff0c;使用openstreet数据。 1&#xff0c;从BBBbike划定区域下载路网数据&#xff0c;BBBike extracts OpenStreetMap (OSM, Garmin, Shapefile etc.) …

1.1电路模型

1.1电路模型 任何实际电路由以下三部分组成&#xff1a; ①提供电能的能源 – 电源 ②用电装置 – 负载 ③传输电能的金属连线 – 导线 实际电路完成的功能&#xff1a;主要有以下两个方面&#xff1a; &#xff08;1&#xff09;进行能量的产生、传输和转换。&#xff08;如…

C++之STL(十)

1、适配器 2、函数适配器 #include <iostream> using namespace std;#include <algorithm> #include <vector> #include <functional>bool isOdd(int n) {return n % 2 1; } int main() {int a[] {1, 2, 3, 4, 5};vector <int> v(a, a 5);cou…

boss直聘招聘数据爬取及可视化分析2.0

boss直聘招聘数据爬取及可视化分析2.0 一、需求介绍二、完整代码2.1 爬虫代码2.2 数据可视化模块一、需求介绍 笔者在前两篇介绍boss直聘招聘数据爬取和可视化分析的博客的基础上,对代码和功能进行了完善。在数据爬取的模块,代码更加简洁易懂,且性能更加稳定;在数据可视化…

linux基于wifi,Xshell的远程连接

最近有个比赛&#xff0c;要使用ros小车但是系统是ubuntu20.04无桌面系统刚开始接触linux的我啥都不会&#xff0c;就一个简单的连接wifi都搞了3天才搞通。再此进行一个总结。参考博客原文链接&#xff1a;https://blog.csdn.net/qq_51491920/article/details/126221940 一、什…

2024年全国青少年信息素养大赛图形化编程复赛样题_6547网

第 1 题 问答题 【编程实现】 按空格键随机切换背景&#xff0c;让背景对应的角色造型显示在舞台上。 【具体要求】 对角色编程&#xff0c;当按下空格键时&#xff0c;背景随机切换&#xff1b; 角色切换成对应的造型显示在舞台上&#xff1b; 角色说“我是”和它的造…

这谁顶得住啊!AI绘画模型竟然可以画出质量逼真的黑丝!

今天看到一个有趣的AI绘画玩法&#xff0c;用SD画黑丝&#xff01;话不多说&#xff0c;开始今天的实战演练。 首先做好准备工作&#xff1a;部署好本地Stable Diffuison 然后就轮到今天的主角上场了 黑丝Lora模型&#xff1a;perfectpantyhose 这是一款叫perfectpantyhose…

使用容器配置文件构建任意应用镜像_并将应用镜像推送到公共仓库共享_应用分享与启动---分布式云原生部署架构搭建012

上面我们编写好了应用,并且,安装好了redis 现在我们把应用打包成镜像. 以前是这样做的,不方便,因为需要在服务器上,安装jdk什么的,现在有了 镜像就不用,给服务器安装镜像什么的了 以后所有机器都安装docker以后,就直接运行就可以了 首先看一下,安装java应用,需要 用到openjd…

项目经理必读:三步走实现项目高效管理

一个项目的成功往往取决于项目管理能力的高低。若管理不当&#xff0c;易导致团队成员间的推诿和抱怨&#xff0c;且项目团队还可能面临成员对目标不明确、信息不透明、进度难以跟踪等问题。作为项目经理&#xff0c;掌握有效的项目管理策略至关重要。 一、精细化的目标拆解 …

idea的代码提示插件使用记录

安装ai插件卸载之后&#xff0c;偶尔还是idea一直占用100%&#xff0c;将idea缓存全清理了&#xff0c;重新生成之后就正常了 idea官方插件 下面几个感觉…基本没有感觉 按行提示的偶尔有提示&#xff0c;&#xff08;cpu占用不小&#xff0c;提示不强&#xff09; 缺点&am…

Node版本管理工具 fnm 安装使用

fnm 是一个基于 Rust 开发的 Node 版本管理工具&#xff0c;它的目标是提供一个快速、简单且可靠的方式来管理 Node.js 的不同版本。同时&#xff0c;它是跨平台的&#xff0c;支持 macOS、Linux、Windows。&#x1f680; Fast and simple Node.js version manager, built in R…

无线通讯几种常规天线类别简介

天线对于无线模块来说至关重要&#xff0c;合适的天线可以优化通信网络&#xff0c;增加其通信的范围和可靠性。天线的选型对最后的模块通信影响很大&#xff0c;不合适的天线会导致通信质量下降。针对不同的市场应用&#xff0c;天线的材质、安置方式、性能也大不一样。下面简…

Springboot集成JWT实现登录注册

记录一下使用Springboot集成JWT实现登录注册&#xff0c;以后有用到直接copy即可。 整体流程 依赖 <!--引入jwt--> <dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.4.0</version> &l…

NodeJS替旅系统-计算机毕业设计源码27907

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。替旅系统设计&#xff0c;主要的模块包括查看后台首页、轮播图&#xff08;轮播图管理&#xff09;、公告管理&#xff08;公告栏&#xff09;、…

TextRank 算法

第1关&#xff1a;Jieba 在关键词提取中的应用 任务描述 本关任务&#xff1a;根据本关所学有关使用 Jieba 库进行关键词提取的知识&#xff0c;编写使用 Jieba 模块进行关键词提取的程序&#xff0c;并通过所有测试用例。 相关知识 为了完成本关任务&#xff0c;你需要掌握…

单细胞差异基因火山图绘制

做完单细胞差异基因分析(FindMarkers/FindAllmarkers)之后&#xff0c;按照常规流程绘制出来的火山图看上去会很奇怪。 1、为什么火山图顶部聚集了很多基因&#xff1f; 这是由于单细胞有别于bulk的特性&#xff0c;会出现两组细胞之间的p值过于显著出现或接近0的情况&#xff…

Unity3D截屏保存本地和上传方法

系列文章目录 unity工具 文章目录 系列文章目录&#x1f449;前言&#x1f449;一、模型截图保存&#x1f449;1-1 模型格式&#x1f449;1-2 设置图片大小&#x1f449;1-3 代码如下 &#x1f449;二、截图上传给后端保存&#x1f449;壁纸分享&#x1f449;总结 &#x1f44…

cad由于找不到mfc140u.dll的解决方法,彻底解决mfc140u.dll丢失问题

在计算机辅助设计&#xff08;CAD&#xff09;的时候&#xff0c;我们可能会遇到各种错误和问题。其中&#xff0c;“CAD由于找不到mfc140u.dll&#xff0c;无法继续执行代码”的错误提示。这个问题可能会导致CAD无法启动运行&#xff0c;因此&#xff0c;我希望通过分享我的经…