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

按斤称的C++散知识

一、多线程

std::thread()、join() 的用法:使用std::thread()可以创建一个线程,同时指定线程执行函数以及参数,同时也可使用lamda表达式。

#include <iostream>
#include <thread>void threadFunction(int num) {std::cout << "Hello from thread with number: " << num << std::endl;
}int main() {int threadNum = 42;std::thread t(threadFunction, threadNum); // 将threadNum传递给线程函数t.join(); // 将会阻塞主线程的执行等待t线程执行完毕// 如果没有使用join可能造成主线程结束而t线程没执行完毕提前消亡return 0;
}

除了使用join以外,也可使用detach()
在C++中,std::thread是一个用于创建线程的类,而detach()是std::thread类的一个成员函数。detach()函数用于将一个std::thread对象与其底层的线程分离,从而允许线程在后台运行,不再与原始std::thread对象关联。

当一个线程被分离后,它的生命周期将不再受到std::thread对象的控制,这意味着在线程执行完成之前,你不再能够对其进行join()操作,也不能检查其是否已经执行完毕。分离线程后,线程的资源将在其执行完成后自动释放,而不需要显式地调用join()函数。

#include <iostream>
#include <thread>void threadFunction() {// 假设这是在一个后台线程中执行的函数std::cout << "Hello from thread!" << std::endl;
}int main() {std::thread t(threadFunction); // 创建线程对象t,并指定线程函数threadFunctiont.detach(); // 将线程与线程对象分离,使得线程在后台执行// 注意:在此处不能使用t.join(),因为线程已经被分离,没有与t相关联的线程了// 主线程继续执行其它任务std::cout << "Main thread continues..." << std::endl;// 这里可能会发生线程在后台执行的输出,也可能不会,因为线程已经分离了// 线程可能在主线程结束前执行,也可能在主线程结束后执行return 0;
}

1.1 std::lock_guard()的用法

std::lock_guard是C++标准库中的一个RAII(资源获取即初始化)类模板,用于在多线程环境中实现互斥锁(std::mutex)的自动上锁和解锁。它提供了一种简单的方式来确保在互斥锁保护的代码块中,获取锁和释放锁的正确顺序和时机,从而避免了因异常或提前返回而导致的锁无法释放的情况。

std::lock_guard的用法如下:

#include <iostream>
#include <mutex>std::mutex mtx; // 创建一个互斥锁void criticalSection() {std::lock_guard<std::mutex> lock(mtx); // 在函数内部创建std::lock_guard对象,并传入互斥锁// 在此处放置需要保护的临界区代码// 在临界区代码执行期间,互斥锁会被自动上锁// 当std::lock_guard对象超出作用域时,会自动释放互斥锁,无需手动解锁
}int main() {std::thread t1(criticalSection);std::thread t2(criticalSection);t1.join();t2.join();return 0;
}

在上面的例子中,std::lock_guard<std::mutex> lock(mtx);这一行创建了一个std::lock_guard对象lock,并传入了互斥锁mtx。当lock_guard对象被创建时,它会自动调用互斥锁的lock()方法来上锁。当lock_guard对象的作用域结束时,无论是通过函数正常返回、抛出异常或是因其他原因退出作用域,它都会自动调用互斥锁的unlock()方法来解锁,确保临界区代码执行完成后互斥锁一定会被正确释放。

使用std::lock_guard的好处是它简化了互斥锁的使用,避免了忘记解锁或异常处理不当导致的死锁问题。它是一种比较安全和推荐的方式来处理多线程的互斥访问问题。

1.2 std::atomic_bool 的用法

std::atomic_bool 是 C++ 标准库中的一个原子布尔类型,用于支持多线程编程中的原子操作。原子操作是一种确保操作不会被其他线程中断的操作,从而避免竞态条件(Race Condition)和数据竞争(Data Race)的发生。

什么是原子操作?

原子操作(Atomic operations)是在计算机科学中的一种操作,指的是不能被中断、分割或交错执行的操作。在多线程或并发环境中,原子操作是为了防止竞态条件(Race Condition)和数据竞争(Data Race)而设计的。竞态条件指的是多个线程在访问共享资源时的不确定性行为,数据竞争则是多个线程在访问内存位置时引发的未定义行为。

原子操作保证了操作的执行是不可分割的,即使在多线程环境下也不会被其他线程的操作干扰。这种操作通常是在硬件级别实现的,使用特定的机器指令或锁机制。

在编程中,原子操作可以确保在并发情况下对共享数据的访问是线程安全的。一些常见的原子操作包括:

  1. 加载(Load): 从内存中读取值,确保读取的操作是原子的,不会在读取过程中被其他线程的写操作干扰。

  2. 存储(Store): 将值写入内存中,确保写操作是原子的,不会在写入过程中被其他线程的读或写操作干扰。

  3. 交换(Exchange): 原子地交换两个值,通常用于实现一些同步机制。

  4. 比较交换(Compare and Swap,CAS): 检查某个内存位置的值是否等于预期值,如果相等,则将新值写入该位置,这个操作用于实现一些锁和同步机制。

  5. 递增和递减(Increment and Decrement): 原子地增加或减少某个内存位置的值。

在 C++ 中,标准库提供了 std::atomic 类模板,用于实现原子操作。您可以使用 std::atomic 来创建原子类型的变量,从而在多线程环境中进行线程安全的操作。例如,std::atomic_int 表示原子整数类型,std::atomic_bool 表示原子布尔类型等。

原子布尔类型 std::atomic_bool 支持以下特性:

  1. 原子操作: std::atomic_bool 支持各种原子操作,包括加载(load)、存储(store)、交换(exchange)、比较交换(compare_exchange_strong 和 compare_exchange_weak)等。

  2. 原子加载和存储: 使用 load 方法可以原子地获取 std::atomic_bool 的值,而使用 store 方法可以原子地设置新的值。

  3. 原子交换: 使用 exchange 方法可以原子地交换 std::atomic_bool 的值,并返回之前的值。

  4. 比较交换: 使用 compare_exchange_strongcompare_exchange_weak 方法可以原子地比较当前值与期望值,并在匹配时更新为新值。

以下是一个简单的示例,展示了如何使用 std::atomic_bool 来实现线程安全的标志变量:

#include <iostream>
#include <atomic>
#include <thread>std::atomic_bool flag(false);void worker() {while (!flag.load(std::memory_order_relaxed)) {// 在这里执行一些工作}std::cout << "Worker thread finished." << std::endl;
}int main() {std::thread t(worker);// 模拟一些工作std::this_thread::sleep_for(std::chrono::seconds(2));flag.store(true, std::memory_order_relaxed);t.join();return 0;
}

在上面的示例中,主线程通过 store 方法将 flag 设置为 true,通知工作线程停止工作。工作线程通过 load 方法定期检查 flag 的值,以判断是否继续工作。这样可以避免了使用标准布尔变量时可能出现的数据竞争问题。

总之,std::atomic_bool 是 C++ 中的原子布尔类型,用于在多线程环境下执行操作,确保操作的原子性以避免竞态条件和数据竞争。

1.3 std::condition_variable的用法

当涉及到多线程编程时,有时候需要让一个线程等待,直到某个条件满足。std::condition_variable 是 C++ 中为这种目的提供的一种机制。

std::condition_variable 通常与 std::mutex 一起使用,来同步线程的执行和等待特定条件的出现。

基本概念如下:

  1. 一个或多个线程可以在特定条件上等待。
  2. 另一个线程可以用来通知等待的线程该条件已满足。

主要方法:

  1. wait(): 使线程等待,直到条件满足。这通常与 std::unique_lockstd::mutex 一起使用。
  2. notify_one(): 唤醒一个等待该条件的线程(如果存在)。
  3. notify_all(): 唤醒所有等待该条件的线程。

简单示例:

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>std::mutex mtx;
std::condition_variable cv;
bool ready = false;void print_id(int id) {std::unique_lock<std::mutex> lock(mtx);while (!ready) {  // 为防止假唤醒,我们使用一个循环来检查条件cv.wait(lock);}std::cout << "thread " << id << '\n';
}void go() {std::unique_lock<std::mutex> lock(mtx);ready = true;cv.notify_all();  // 唤醒所有等待的线程
}int main() {std::thread threads[10];for (int i = 0; i < 10; ++i)threads[i] = std::thread(print_id, i);std::cout << "10 threads ready to race...\n";go();for (auto &th : threads)th.join();return 0;
}

在上面的示例中,我们有10个线程都在等待“比赛”开始。主线程会设置 readytrue,然后使用 cv.notify_all() 通知所有等待的线程。这样,所有线程都会开始执行。

使用 std::condition_variable 时需要注意:

  • 可能会发生“假唤醒”(即没有任何线程调用 notify_* 的情况下,等待的线程可能被唤醒)。为了安全地处理这种情况,应该始终在一个循环中检查条件。
  • 当使用 wait() 方法时,必须提供一个 std::unique_lock,该锁应该在调用 wait() 之前上锁。 wait() 会自动释放锁,允许其他线程进入临界区,并在条件满足后重新获取锁。

二、基础语法知识

2.1 static的用途

当应用于不同上下文中,static 关键字在C++中具有不同的含义和用法。下面是对 static 的几种常见用法的总结:

  1. 静态成员变量

    • 在类中声明的静态成员变量是类的所有实例共享的,而不是每个实例独立拥有的。
    • 静态成员变量在类的所有实例之间保持相同的值。
    • 静态成员变量可以通过类名或类的实例来访问。
  2. 静态成员函数

    • 静态成员函数与类的实例无关,只能访问类的静态成员变量和其他静态成员函数。
    • 静态成员函数在调用时不需要通过类的实例来调用,可以直接使用类名调用。
  3. 静态局部变量

    • 静态局部变量是在函数内部声明的变量,但只在第一次进入该函数时初始化,之后函数退出再次进入时保持上次的值。
    • 静态局部变量在函数调用之间保持状态,可用于保留跨多次函数调用的信息。
  4. 静态全局变量

    • 在函数外部声明的静态全局变量只能在声明它的文件内可见,不会受到其他文件的影响。
    • 静态全局变量在整个程序运行期间保持其值,不会受到函数调用的限制。
  5. 静态类成员(C++17起):

    • 在类中声明的静态成员可以用 inline 关键字指定为内联。
    • 静态类成员可以在类的定义中直接初始化,无需在类外进行初始化。

总之,static 在C++中有多种用法,可以用于创建静态成员、静态函数、静态局部变量以及限定全局变量的作用域。根据不同的上下文,static 提供了不同的功能和特性。

其中单例模式中用到了静态成员函数
在C++中,你可以在类中定义一个静态成员函数,并且让这个静态成员函数返回该类的引用。下面是一个示例代码来展示如何实现这一点:

class MyClass {
public:// 静态公有函数,返回类的引用static MyClass& GetInstance() {// 在这里可以进行一些初始化操作,如果需要的话// 返回类的引用static MyClass instance;return instance;}// 其他类成员和函数...private:// 私有构造函数,防止外部直接实例化MyClass() {// 构造函数的初始化操作}// 防止复制和赋值MyClass(const MyClass&) = delete;MyClass& operator=(const MyClass&) = delete;// 私有成员变量和函数...
};int main() {// 通过静态函数获取类的引用MyClass& myInstance = MyClass::GetInstance();// 使用myInstance进行操作...return 0;
}

在这个示例中,GetInstance() 静态成员函数创建并返回了一个静态局部变量 instance 的引用,确保了该类只有一个实例,并且在首次调用该函数时初始化。私有的构造函数和删除复制构造函数及赋值运算符重载函数都有助于防止直接的实例化和复制。

三、C++ 11 新特性

1.std::function<void()>

std::function<void()> 是 C++11 中引入的标准库模板类,它是一个通用的函数包装器,可以用来存储和调用任意可调用对象,如函数、函数对象、Lambda 表达式等,它们的返回类型是 void,且没有参数。

这个模板类是定义在 <functional> 头文件中的,可以通过使用 std::function<void()> 来声明一个函数包装器,使其能够存储返回类型为 void,无参数的可调用对象。

以下是 std::function<void()> 的一些重要特性和用法:

  1. 声明函数包装器:

    #include <functional>std::function<void()> myFunction;
    

    这里声明了一个名为 myFunctionstd::function,它可以包装返回类型为 void,无参数的可调用对象。

  2. 赋值函数对象或Lambda表达式:

    struct MyFunctor {void operator()() {std::cout << "Hello from functor!" << std::endl;}
    };myFunction = MyFunctor(); // 使用函数对象
    // 或者
    myFunction = []() {std::cout << "Hello from lambda!" << std::endl;
    }; // 使用Lambda表达式
    
  3. 调用函数包装器:

    myFunction(); // 将会调用所包装的可调用对象
    
  4. 判断函数包装器是否为空:

    if (myFunction) {// myFunction 不为空,可以调用myFunction();
    }
    
  5. 重设或清除函数包装器:

    myFunction = nullptr; // 或 myFunction = std::function<void()>();
    // 现在 myFunction 变为空,不能再调用
    
  6. 使用 std::bind 绑定带参数的函数:

    #include <iostream>
    #include <functional>void greet(const std::string& name) {std::cout << "Hello, " << name << "!" << std::endl;
    }int main() {std::function<void(const std::string&)> greetFunction = std::bind(greet, "Alice");greetFunction(); // 输出:Hello, Alice!return 0;
    }
    

    这里我们通过 std::bind 将一个带参数的函数 greet 绑定到了 greetFunction 上,使得它成为一个没有参数的函数包装器,但在调用时会传递预先绑定的参数。

总之,std::function<void()> 是一个功能强大的工具,可以用于在运行时存储和调用不同类型的可调用对象,特别是在需要根据运行时条件来动态地选择和执行函数时非常有用。

对于简单的情况,直接调用函数 initA()initB() 是更加直观和方便的做法,没有必要使用 std::function<void()> 这样的函数对象。

std::function<void()> 更适用于以下场景:

  1. 函数对象的运行时选择: 当需要在运行时根据条件或配置选择不同的初始化函数时,可以使用 std::function<void()> 来存储并动态调用相应的函数。例如,可以根据配置文件或用户输入来选择执行不同的初始化函数,而不需要修改代码逻辑。

  2. 作为参数传递: 如果某个函数需要接受一个可调用对象作为参数,但这个可调用对象的具体类型是不确定的,那么可以使用 std::function<void()> 作为参数类型。这样,调用者可以传递任意的函数、函数对象或 Lambda 表达式,而函数内部可以通过 std::function 来调用这个传递进来的可调用对象。

  3. 作为返回值: 类似地,如果某个函数需要返回一个可调用对象,但具体返回哪个函数或函数对象是根据一些条件决定的,可以使用 std::function<void()> 作为返回类型,灵活返回不同的函数或函数对象。

  4. 函数指针替代: 在一些历史遗留代码或与 C 接口交互的情况下,可能需要将函数指针封装成更安全的 std::function<void()> 对象,以方便使用和管理。

总结来说,std::function<void()> 更适合需要在运行时动态选择或处理可调用对象的情况。对于固定、静态的函数调用,直接调用函数更简单明了。使用 std::function 主要是为了更大的灵活性和通用性。

2. =default(), =delete

在 C++ 中,当类的成员函数被声明时,我们可以使用 = default= delete 来指定它们的默认行为或删除该函数。这些用法是 C++11 中引入的特性。

  1. = default 当我们在类中的成员函数声明后面使用 = default,表示我们希望编译器生成默认的函数实现。这主要用于特殊成员函数(默认构造函数、拷贝构造函数、拷贝赋值运算符和析构函数)。当我们显式地声明类的某个特殊成员函数时,编译器不会再自动生成该函数。但是,如果我们在函数声明后使用 = default,编译器将会自动生成该函数的默认实现。

    class MyClass {
    public:// 默认构造函数MyClass() = default;// 拷贝构造函数MyClass(const MyClass& other) = default;// 拷贝赋值运算符MyClass& operator=(const MyClass& other) = default;// 默认析构函数~MyClass() = default;// 其他函数声明
    };
    
  2. = delete 当我们在类的成员函数声明后面使用 = delete,表示我们禁用了该函数,使得它不能被调用。这通常用于阻止某些不合适的操作,或者是防止某些函数的隐式调用。使用 = delete 可以让编译器在尝试调用该函数时产生编译错误。

    class MyClass {
    public:// 禁用默认构造函数MyClass() = delete;// 禁用拷贝构造函数MyClass(const MyClass& other) = delete;// 禁用拷贝赋值运算符MyClass& operator=(const MyClass& other) = delete;// 其他函数声明
    };
    

使用 = default= delete 可以在设计类的接口时,更加精确地控制特殊成员函数的生成和可用性,从而增加代码的可读性和安全性。

3.std::enable_shared_from_this

在C++中,std::enable_shared_from_this 是一个模板类,它提供了一种方式,使得在一个继承了该类的对象中,能够安全地获取一个指向其 std::shared_ptr 的引用。这在处理基于共享指针的资源管理和对象生命周期控制时非常有用,特别是在对象之间存在互相引用的情况下。

这个模板类通常与 std::shared_ptr 一起使用,以确保在对象删除之前,共享指针的引用计数能够正确地管理。

以下是 std::enable_shared_from_this 的基本用法和示例:

#include <iostream>
#include <memory>class MyClass : public std::enable_shared_from_this<MyClass> {
public:std::shared_ptr<MyClass> getShared() {return shared_from_this();  // 获取指向当前对象的 shared_ptr}void print() {std::cout << "Hello from MyClass" << std::endl;}
};int main() {std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>();std::shared_ptr<MyClass> ptr2 = ptr1->getShared();ptr1->print();ptr2->print();return 0;
}

在这个例子中,MyClass 继承自 std::enable_shared_from_this<MyClass>,这就允许 MyClass 对象内部调用 shared_from_this() 方法来获得指向自身的 std::shared_ptr。通过这种方式,可以在不增加引用计数的情况下获得对象的共享指针,避免出现循环引用导致的内存泄漏。

需要注意以下几点:

  1. 必须使用 std::shared_ptr 来管理对象,否则 shared_from_this() 将导致未定义行为。
  2. 对象必须通过 std::shared_ptr 进行共享,而不能通过裸指针或其他智能指针进行管理。
  3. 在对象的生命周期中,只能调用一次 shared_from_this(),否则会导致未定义行为。

总之,std::enable_shared_from_this 为共享指针的资源管理提供了一种更加安全和便捷的方法,尤其适用于涉及循环引用的情况下。

相关文章:

按斤称的C++散知识

一、多线程 std::thread()、join() 的用法&#xff1a;使用std::thread()可以创建一个线程&#xff0c;同时指定线程执行函数以及参数&#xff0c;同时也可使用lamda表达式。 #include <iostream> #include <thread>void threadFunction(int num) {std::cout <…...

C++策略模式

1 简介&#xff1a; 策略模式是一种行为型设计模式&#xff0c;用于在运行时根据不同的情况选择不同的算法或行为。它将算法封装成一个个具体的策略类&#xff0c;并使这些策略类可以相互替换&#xff0c;以达到动态改变对象的行为的目的。 2 实现步骤&#xff1a; 以下是使用…...

如何在网页下载腾讯视频为本地MP4格式

1.打开腾讯视频官网地址 腾讯视频 2.搜索你想要下载的视频 3. 点击分享,选择复制通用代码 <iframe frameborder="0" src="ht...

opencv-yolov8-目标检测

import cv2 from ultralytics import YOLO# 模型加载权重model YOLO(yolov8n.pt)# 视频路径cap cv2.VideoCapture(0)# 对视频中检测到目标画框标出来 while cap.isOpened():# Read a frame from the videosuccess, frame cap.read()if success:# Run YOLOv8 inference on th…...

CRYPTO 密码学-笔记

一、古典密码学 1.替换法&#xff1a;用固定的信息&#xff0c;将原文替换成密文 替换法的加密方式&#xff1a;一种是单表替换&#xff0c;另一种是多表替换 单表替换&#xff1a;原文和密文使用同一张表 abcde---》sfdgh 多表替换&#xff1a;有多涨表&#xff0c;原文和密文…...

基于YOLOv8模型的五类动物目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOv8模型的五类动物目标检测系统可用于日常生活中检测与定位动物目标&#xff08;狼、鹿、猪、兔和浣熊&#xff09;&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与…...

Java课题笔记~ SpringBoot基础配置

二、基础配置 1. 配置文件格式 问题导入 框架常见的配置文件有哪几种形式&#xff1f; 1.1 修改服务器端口 http://localhost:8080/books/1 >>> http://localhost/books/1 SpringBoot提供了多种属性配置方式 application.properties server.port80 applicati…...

vue实现文件上传,前后端

前端封装el-upload组件&#xff0c;父组件传值dialogVisible&#xff08;用于显示el-dialog&#xff09;&#xff0c;子组件接收&#xff0c;并且关闭的时候返回一个值&#xff08;用于隐藏el-dialog&#xff09;,最多上传五个文件&#xff0c;文件格式为.jpg\pdf\png <tem…...

OJ练习第151题——克隆图

克隆图 力扣链接&#xff1a;133. 克隆图 题目描述 给你无向 连通 图中一个节点的引用&#xff0c;请你返回该图的 深拷贝&#xff08;克隆&#xff09;。 示例 分析 对于一张图而言&#xff0c;它的深拷贝即构建一张与原图结构&#xff0c;值均一样的图&#xff0c;但是…...

keepalived+lvs实现高可用

目录 环境 1.配置real-server服务器 2.配置keepalived和lvs 3.测试&#xff1a; 概述 keepalivedlvs实现高可用&#xff1a; lvs可以监控后端服务器&#xff0c;当服务器宕机之后可以对其进行故障切换。 keepalived是对VIP进行检测&#xff0c;当某一个主机的vip错误&…...

【Let‘s make it big】英语合集61~70

61(82) top-of-range it doesn’t get any better than this There seems to be a problem with my account What seems to be the problem withdraw money from my saving account charged an overdraft fee we don’t give loans to customers whose accounts are overdrawn…...

python实现图像的二分类

要实现图像的二分类&#xff0c;可以使用深度学习中的卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;模型。下面是一个使用Keras库实现的简单CNN模型示例&#xff1a; from keras.models import Sequential from keras.layers import Conv2D, MaxPoo…...

8.深浅拷贝和异常处理

开发中我们经常需要复制一个对象。如果直接用赋值会有下面问题: 8.1 浅拷贝 首先浅拷贝和深拷贝只针对引用类型 浅拷贝&#xff1a;拷贝的是地址 常见方法: 1.拷贝对象&#xff1a;Object.assgin() / 展开运算符{…obj} 拷贝对象 2.拷贝数组&#xff1a;Array.prototype.con…...

Element Plus el-table 数据为空时自定义内容【默认为 No Data】

1. 通过 Table 属性设置 <div class"el-plus-table"><el-table empty-text"暂无数据" :data"tableData" style"width: 100%"><el-table-column prop"date" label"Date" width"180" /&g…...

使用nginx和frp实现高效内网穿透:简单配置,畅通无阻

I. 引言 A. 介绍内网穿透的概念和用途 内网穿透是一种网络技术&#xff0c;它允许用户通过公共网络访问位于私有网络&#xff08;内网&#xff09;中的资源和服务。在传统的网络环境中&#xff0c;内网通常是由路由器或防火墙保护的&#xff0c;无法直接从外部网络访问内部资…...

Python土力学与基础工程计算.PDF-螺旋板载荷试验

python 求解代码如下&#xff1a; 1. import numpy as np 2. 3. # 已知参数 4. p_a 100 # 标准压力&#xff0c; kPa 5. p np.array([25, 50, 100, 200) # 荷载&#xff0c; kPa 6. s np.array([2.88, 5.28, 9.50, 15.00) / 10 # 沉降量&#xff0c; cm 7. D 10 # 螺旋板直…...

低代码开发ERP:精打细算,聚焦核心投入

企业数字化转型已经成为现代商业环境中的一项关键任务。如今&#xff0c;企业面临着日益激烈的竞争和不断变化的市场需求。在这样的背景下&#xff0c;数字化转型不仅是企业生存的必然选择&#xff0c;也是取得竞争优势和实现可持续发展的关键因素。 在数字化转型的过程中&…...

顺序表(数据结构)

“路虽远&#xff0c;行则将至” ❤️主页&#xff1a;小赛毛 顺序表目录 1.线性表 2.顺序表 概念及结构 静态顺序表&#xff1a;使用定长数组存储元素。 动态顺序表&#xff1a;使用动态开辟的数组存储。 接口实现 1.线性表 线性表 &#xff08; linear list &#xff09; 是…...

stable_diffusion_webui docker环境配置

1.新建docker环境 docker run -tid --name e_commerce_sd --net host --runtimenvidia nvidia/cuda:11.1-cudnn8-devel-cent os7-ssh /bin/bashdocker exec -ti e_commerce_sd /bin/bash echo expor…...

【Java】常见面试题:HTTP/HTTPS、Servlet、Cookie、Linux和JVM

文章目录 1. 抓包工具&#xff08;了解&#xff09;2. 【经典面试题】GET和POST的区别&#xff1a;3. URL中不是也有这个服务器主机的IP和端口吗&#xff0c;为啥还要搞个Host&#xff1f;4. 补充5. HTTP响应状态码6. 总结HTTPS工作过程&#xff08;经典面试题&#xff09;7. H…...

批量爬虫采集完成任务

批量爬虫采集是现代数据获取的重要手段&#xff0c;然而如何高效完成这项任务却是让许多程序员头疼的问题。本文将分享一些实际操作价值高的方法&#xff0c;帮助你提高批量爬虫采集的效率和专业度。 目标明确&#xff0c;任务合理划分&#xff1a; 在开始批量爬虫采集前&…...

intelij idea 2023 创建java web项目

1.点击New Project 2.创建项目名称为helloweb &#xff0c;jdk版本这里使用8&#xff0c;更高版本也不影响工程创建 点击create 3.新建的工程是空的&#xff0c;点击File-> Project Structure 4.点击Modules 5.点击加号&#xff0c;然后键盘输入web可以搜索到web模块&…...

【论文笔记】基于指令回译的语言模型自对齐-MetaAI

MetaAI最近发布的Humpback&#xff0c;论文链接&#xff1a;https://arxiv.org/abs/2308.06259 解决什么问题&#xff1f; 大量高质量的指令微调数据集的生成。 思路 在这项工作中&#xff0c;我们通过开发迭代自训练算法来利用大量未标记的数据来创建高质量的指令调优数据集…...

MySQL和MariaDB的版本对应关系

MariaDB 10.0和MariaDB 10.1可以作为MySQL 5.6的有限替代。 MariaDB 10.2可以作为MySQL 5.7的有限替代。 一&#xff0c;目前最新版本 MariaDB 10.5.8 10.4.17 10.3.27 10.2.36 MySQL 8.0.23 二&#xff0c;oracle MySQL版本和MariaDB版本对应表: MariaDB版本 …...

Python数据的输入与输出

编辑&#xff1a;2023-08-14 17:00 Python是一种高级编程语言&#xff0c;它支持多种输入输出方式&#xff0c;包括标准输入输出、文件输入输出等。本文将从以下几个方面详细阐述Python数据的输入与输出。 一、标准输入输出 Python中的标准输入和标准输出指的是控制台输入输…...

生成国密密钥对

在线生成国密密钥对 生成的密钥对要妥善保管&#xff0c;丢失是无法找回的。...

ASR(自动语音识别)任务中的LLM(大语言模型)

一、LLM大语言模型的特点 二、大语言模型在ASR任务中的应用 浅度融合 浅层融合指的是LLM本身并没有和音频信息进行直接计算。其仅对ASR模型输出的文本结果进行重打分或者质量评估。 深度融合 LLM与ASR模型进行深度结合&#xff0c;统一语音和文本的编码空间或者直接利用ASR…...

简单介绍一下centos上有什么工具可以优雅的管理开机启动项

在CentOS上&#xff0c;你可以使用以下工具来优雅地管理开机启动项&#xff1a; systemctl&#xff1a;systemctl 是 systemd 系统和服务管理器的主要命令。它提供了一种优雅的方式来管理启动项。你可以使用 systemctl 命令来启用、禁用、查看和管理系统服务。例如&#xff0c;…...

万宾燃气管网监测解决方案,守护城市生命线安全

方案背景 城市燃气管网作为连接天然气长输管线与天然气用户的桥梁&#xff0c;担负着向企业和居民用户直接供气的重要职责。随着城市燃气需求的急剧增加&#xff0c;城市燃气管网规模日趋庞大&#xff0c;安全隐患和风险也随之增加。目前&#xff0c;我国燃气管网的运行仍存在…...

Django框架 靓号管理(增删改查)

Django框架 靓号管理&#xff08;增删改查&#xff09; 新建一个项目 backend 使用pycharm创建app startapp app项目目录 C:\code\backend ├── app | ├── admin.py | ├── apps.py | ├── migrations | ├── models.py | ├── tests.py | ├── views.…...

责任链模式简单实现

两种实现方式 第一种 public interface IBaseTask {public void doAction(String isTask,IBaseTask iBaseTask); }public class ChainManager implements IBaseTask{//工作类的集合private List<IBaseTask> iBaseTaskList new ArrayList<>();public void addTas…...

Excel自动化办公——Openpyxl的基本使用

Excel自动化办公——Openpyxl的基本使用 个人感觉&#xff0c;相比Pandas&#xff0c;openpyxl对Excel的操作更为细致&#xff0c;Pandas则更适用于统计计算&#xff1b; 01 基本环境02 Excel数据读取操作03 案例04 向Excel写入数据05 表数据定向修改06 单元格样式制定07 单元…...

解决Fastjson2 oom(Out Of Memory),支持大对象(LargeObject 1G)json操作

在使用Fastjson中的 JSON.toJSONString时,如果对象数据太大&#xff08;>64M&#xff09;会出现Out Of Memory,查看源码发现为JSONWriter中的判断代码 其中maxArraySize默认最大为64M,如果超过了就会抛出oom错误 如果fastjson过多的使用内存,也可能导致java堆内存溢出,所以这…...

SpringBoot + redis处理购物车逻辑

1、pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 2、application.xml spring: characterEncodingutf-8&useSSLfalseredis:host: 127.0.…...

open cv学习 (五) 图像的阈值处理

图像的阈值处理 demo1 # 二值化处理黑白渐变图 import cv2 img cv2.imread("./img.png", 0) # 二值化处理 t1, dst cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) cv2.imshow("img", img) cv2.imshow("dst", dst) cv2.waitKey() cv2.des…...

NVIDIA vGPU License许可服务器高可用全套部署秘籍

第1章 前言 近期遇到比较多的场景使用vGPU&#xff0c;比如Citrix 3D场景、Horizon 3D场景&#xff0c;还有AI等&#xff0c;都需要使用显卡设计研发等&#xff0c;此时许可服务器尤为重要&#xff0c;许可断掉会出现掉帧等情况&#xff0c;我们此次教大家部署HA许可服务器。 …...

基于CNN卷积神经网络的口罩检测识别系统matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ............................................................ % 循环处理每张输入图像 for…...

《HeadFirst设计模式(第二版)》第九章代码——迭代器模式

情景&#xff1a; 一家早餐店和一家午餐点准备合并在一起&#xff0c;两家的点菜的菜单实现方式如下: 首先&#xff0c;他们的菜单选项都基于同一个类&#xff1a; 菜单选项类 package Chapter9_IteratorPattern.Origin;/*** Author 竹心* Date 2023/8/17**/public class Men…...

Electron入门,项目启动。

electron 简单介绍&#xff1a; 实现&#xff1a;HTML/CSS/JS桌面程序&#xff0c;搭建跨平台桌面应用。 electron 官方文档&#xff1a; [https://electronjs.org/docs] 本文是基于以下2篇文章且自行实践过的&#xff0c;可行性真实有效。 文章1&#xff1a; https://www.cnbl…...

深入理解索引B+树的基本原理

目录 1. 引言 2. 为什么要使用索引&#xff1f; 3. 索引的概述 4. 索引的优点是什么&#xff1f; 4.1 降低数据库的IO成本&#xff0c;提高数据查找效率 4.2 保证数据库每一行数据的唯一性 4.3 加速表与表之间的连接 4.4 减少查询中分组与排序的执行时间 5. 索引的缺点…...

vue3 简易用对话框实现点击头像放大查看

设置头像悬停手势 img:hover{cursor: pointer;}效果&#xff1a; 编写对话框 <el-dialog class"bigAvatar"style"border-radius: 4px;"v-model"deleteDialogVisible"title"查看头像"top"5px"><div><img src&…...

opencv 矩阵运算

1.矩阵乘&#xff08;*&#xff09; Mat mat1 Mat::ones(2,3,CV_32FC1);Mat mat2 Mat::ones(3,2,CV_32FC1);Mat mat3 mat1 * mat2; //矩阵乘 结果 2.元素乘法或者除法&#xff08;mul&#xff09; Mat m Mat::ones(2, 3, CV_32FC1);m.at<float>(0, 1) 3;m.at…...

第四章 字符串part01

344.反转字符串 public void reverseString(char[] s) {int len s.length;int left 0;int right len-1;while (left < right){char tmp s[right];s[right] s[left];s[left] tmp;left;right--;} }反转字符串II 注意String不可变&#xff0c;因此可使用char数组或者St…...

Python3内置函数大全

吐血整理 Python3内置函数大全 1.abs()函数2.all()函数3.any()函数4.ascii()函数5.bin()函数6.bool()函数7.bytes()函数8.challable()函数9.chr()函数10.classmethod()函数11.complex()函数12.complie()函数13.delattr()函数14.dict()函数15.dir()函数16.divmod()函数17.enumer…...

什么是“新型基础设施”?建设重点是什么?

一是信息基础设施。主要是指基于新一代信息技术演化生成的基础设施&#xff0c;比如&#xff0c;以5G、物联网、工业互联网、卫星互联网为代表的通信网络基础设施&#xff0c;以人工智能、云计算、区块链等为代表的新技术基础设施&#xff0c;以数据中心、智能计算中心为代表的…...

混杂接口模式---vlan

策略在两个地方可以用--1、重发布 2、bgp邻居 2、二层可以干的&#xff0c;三层也可以干 3、未知单播&#xff1a;交换机的MAC地址表的记录保留时间是5分钟&#xff0c;电脑的ARP表的记录保留时间是2小时 4、route recursive-lookup tunnel 华为默认对于bgp学习来的路由不开启标…...

Greenplum多级分区表添加分区报错ERROR: no partitions specified at depth 2

一般来说&#xff0c;我们二级分区表都会使用模版&#xff0c;如果没有使用模版特性&#xff0c;那么就会报ERROR: no partitions specified at depth 2类似的错误。因为没有模版&#xff0c;必须要显式指定分区。 当然我们在建表的时候&#xff0c;如果没有指定&#xff0c;那…...

EV PV AC SPI CPI TCPI

SPI EV / PV CPI EV / ACCPI 1.25 SPI 0.8 PV 10 000 BAC 100 000EV PV * SPI 10 000 * 0.8 8000 AC EV / CPI 8000 / 1.25 6400TCPI (BAC - EV) / (BAC -AC) (100 000 - 8 000) / (100 000 - 6 400) 92 000 / 93 600 0.98290598...

【电商领域】Axure在线购物商城小程序原型图,品牌自营垂直电商APP原型

作品概况 页面数量&#xff1a;共 60 页 兼容软件&#xff1a;Axure RP 9/10&#xff0c;不支持低版本 应用领域&#xff1a;网上商城、品牌自营商城、商城模块插件 作品申明&#xff1a;页面内容仅用于功能演示&#xff0c;无实际功能 作品特色 本作品为品牌自营网上商城…...

Cpp基础Ⅰ之编译、链接

1 C是如何工作的 工具&#xff1a;Visual Studio 1.1 预处理语句 在.cpp源文件中&#xff0c;所有#字符开头的语句为预处理语句 例如在下面的 Hello World 程序中 #include<iostream>int main() {std::cout <"Hello World!"<std::endl;std::cin.get…...