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

C++ Primer Plus第十四章笔记

目录

1.包含对象成员的类

valarray类简介

1.2 Student类的设计

1.3 接口和实现

1.4 C++和约束

2. 私有继承

2.1 私有继承和组合的异同

2.2 初始化基类组件

2.3 访问基类的方法

2.4 访问基类对象

2.5 访问基类的友元函数

2.5 使用组合还是私有继承

3. 保护继承

4. 使用using重新定义访问权限

5. 多重继承(MI)

5.1 MI可能带来的问题

5.2 程序worker的分析

6. 类模板

6.1 定义类模板

6.2 使用模板类

6.3 数组模板和非类型参数

6.4 模板多功能性

6.5 模板的具体化

6.6 成员模板

6.7 使用模板作为参数

6.8 模板类和友元

6.9 模板别名(C++11)


C++的主要目标:促进代码重用。通过公有继承来实现这种目标机制。

1.包含对象成员的类

通过动态内存分配来表示数组,使得数组长度不被限制。

valarray类简介

valarrat类 由头文件 valarray 支持。valarray被定义为一个模板类,以能够处理不同类型的数据类型。

模板特性意味着声明对象时,必须指定具体的数据类型。所以。valarray类来声明一个对象时,需要在标识符valarray后面加上一对尖括号,并在其中包含所需的数据类型。

double gpa[5] = {3.1,3.5,3.8,2.9,3.3}       
valarray<double> v1;                    // double类型数组,大小为0
valarray<int> v2(8);                    // 8个int类型的元素数组
valarray<int> v3(10,8);                 // 8个int类型的元素数组,每个设置为10
valarray<doubl> v4(gpa,4);              // 4个元素数组,初始化
valarray<int> v5 = {20,32,17,9};        // 在C++11中,用来初始化列表

可以创建长度为0的数组、指定长度的空数组、所有元素被初始化为指定值的数组、用常规数组中的值来进行初始化的数组。

valarray类的一些方法:

  • operator[]():访问各个元素
  • size():返回包含的元素个数
  • sum():返回所有元素的总和
  • max():返回最大的元素
  • min():返回最小的元素

1.2 Student类的设计

学生和其它类之间不是 is-a关系,而是 has-a关系。学生有姓名和一组考试分数。

has-a 关系的C++技术是组合(包含),即创建一个包含其他类对象的类。

class Student
{// 声明私有数据成员private:string name;                // 使用string对象valarray<double> scores;    // 使用 valarray<double> 对象...// 成员函数可以使用 公有接口 来修改 name和 scores对象。但在类的外部不可行(通过Student类的公有接口来访问)
}

1.3 接口和实现

  • 使用公有继承时,类可以继承接口。还会有实现(基类的纯虚函数提供接口,但不提供实现)

    • 获得接口是 is-a 关系的组成部分。
  • 使用组合,类可以获得实现,但不能获得接口。

    • 不继承接口是 has-a 关系的组成部分
    • has-a 关系上,类对象不能自动获得被包含对象的接口。

1.4 C++和约束

C++包含让程序员限制程序结构的特性 ---- 使用 explicit 防止单参数构造函数的隐式转换。使用 const限制方法修改数据等。

原因:在编译阶段出现错误优于在运行阶段出现错误。

2. 私有继承

实现 has-a 关系的另外一个途径 ---- 私有继承

使用私有继承,基类的公有成员和保护成员都将成为派生类的私有成员。意味着基类方法将不会成为派生对象公有接口的一部分,但可在派生类的成员函数中使用。

派生类不基础基类的接口。

2.1 私有继承和组合的异同

  • 相同点

    • 私有继承
      • 获得实现,但不获得接口。
      • 将对象作为一个未被命名的继承对象添加到类中。
    • 组合
      • 将对象作为一个命名的成员对象添加到类中。
  • 不同点

    • 类将继承实现
    • 组合提供两个被显式命名的对象成员。
    • 私有继承提供两个无名称的子对象成员。
    • 组合使用对象名来调用方法
    • 私有继承使用类名 和 作用域解析运算符来调用方法。

要进行私有继承,使用关键字 private 而不是 public 来定义类。

2.2 初始化基类组件

隐式继承组件而不是成员对象,会影响代码的编写。所以使用公有继承。

// 使用组合的构造函数,直接使用成员名来标识构造函数
Student(const char * str, const double * pd , int n): name(str),scores(pd,n) {} // 使用继承类,使用类名而不是成员名来标识构造函数
Student(const char * str, const double *pd, int n): std::string(str), ArrayDb(pd,n) {} // ArrayDb 是 std::valarray<double> 的别名

2.3 访问基类的方法

使用私有继承时,只能在派生类的方法中使用基类的方法。

  • 在私有继承使得使用类名作用域解析运算符来调用基类的方法
  • 组合是直接使用对象名来调用方法。
double Student::Average() const
{if (ArrayDb::size > 0)return ArrayDb::sum / ArrayDb::size();elsereturn 0;
}

2.4 访问基类对象

通过强制类型转换。将Student对象转换为string对象。

指针this 指向用来调用方法的对象,因此 *this 为用来调用方法的对象。

const string & Student::Name() const
{return (const string &) *this; // 返回一个引用,引用指向用于调用方法的Student对象中的继承而来的string对象。
}

2.5 访问基类的友元函数

用类名显式地限定函数名不适合友元函数。 友元不属于类,但是可以通过显式转换为基类来调用正确的函数。

ostream & operator<<(ostream & os, const Student & stu)
{os << "Scores for " << (const string &) stu << " : \n";...
}

2.5 使用组合还是私有继承

多数选择程序员选择使用 组合。原因:

  • 易于理解。
    • 类声明中组合表示被包含类的显式命名对象。代码可以通过名称引用对象
    • 继承会使得关系更抽象难懂。
  • 继承会引起很多问题
    • 组合可以包含多个同类的子对象。
    • 继承只能使用一个对象(当对象都没有名称时,会难以区分)。

通常情况下:

  • 应使用组合来建立 has-a 关系
  • 如果新类需要访问原有类的保护成员,或者需要重新定义虚函数,则应使用私有继承

3. 保护继承

保护继承是私有继承的变体。

在基类中使用 关键字protected 来进行声明。

class Student : protected std::string, protected std::valarray<double>{...
};

使用保护继承时,基类中的公有成员和保护成员都会变成派生类的保护成员。

  • 使用 私有继承 时,第三代类将不能使用基类的接口。
    • 基类的公有方法在派生类中将变成私有方法。
  • 使用 保护继承 时,基类的公有方法在第二代中将变成受保护的,所以第三代派生类可以使用。

4. 使用using重新定义访问权限

使用保护派生或私有派生时,基类的公有成员将成为保护成员或私有成员。

让基类的方法在派生类外可用的两种方式:

  • 定义一个使用该基类方法的派生类方法
  • 将函数调用包封装在另一个函数调用中。通过using声明来指出派生类可以使用特定的基类成员。(类似 using namespace std; 名次空间的方式)

using 声明只使用成员名 ---- 没有圆括号、函数特征标和返回类型

class Student : private std::string, private std::valarray<double>
{...public:using std::valarray<double>::min;using std::valarray<double>::max;...
};

5. 多重继承(MI)

使用多个基类的继承被称为 多重继承(multiple inheritance,MI) 。

MI描述的是is-a关系。

MI必须使用 关键字public 来限定每一个基类。原因:非特别指出,编译会认为是私有派生。

// 从Singer 和 Waiter 公有派生出SingerWaiter
class SingerWaiter : public Waiter, public Singer {...};
// Singer 和 Waiter 都继承了一个 Worker组件,所以SingerWaiter则组合两个Woker组件

5.1 MI可能带来的问题

  • 从两个不同的基类基础同名方法
  • 从两个或者更多基类那里继承了同一个类的多个实例

5.2 程序worker的分析

把基类指针设置为派生对象中的基类对象的地址,有两种地址可选择,应使用类型转换来指定对象。

Worker *pw1 = (Waiter *) &ed;
Worker *pw2 = (Singer *) &ed;
  • 虚基类
    • 虚基类使得从多个类(基类相同)派生出的对象只继承一个基类对象。在类声明中使用关键字 virtual 来指示派生时,基类则成为虚基类
    • C++在基类是虚的时,禁止信息通过中间类自动传递给基类。
    • 如果不希望默认构造函数来构造虚基类对象,则需要显式地调用所需的基类构造函数。

如果类有间接虚基类,则除非只需要使用该虚基类的默认构造函数,否则必须显式地调用该虚基类的某个构造函数。

在多重继承中,每个直接祖先都有一个相同的函数(如Show()),使得派生类调用此函数时存在二义性。此时需要使用作用域解析运算符来澄清编程者的意图。

SingerWaiter newhire("Elise Hawks",2005,6,soprano)
newhire.Singer::Show();
  • 如果基类是虚基类,派生类将包含基类的一个子对象。
  • 如果基类不是虚基类,派生类将包含多个子对象。

如果类从不同的类哪里继承了两个或者更多的同名成员(数据或方法)则使用该成员名时,通过使用虚基类,某个名称优先于其他所有名称,则使用,如果不使用限定符,也不会导致二义性。

6. 类模板

C++模板提供参数化(parameterised)类型:能够让类型名作为参数传递给接收方来建立类或函数。

6.1 定义类模板

模板类的代码定义:

template <typename Type> // 模板类型
template <class Type> // 模板类
  • template 告诉编译器,将要定义一个模板,尖括号中的内容相当于函数的参数列表。
  • 关键字 class 看作变量的类型名,变量接受类型作为其值,把Type看作是该变量的名称。
  • Type 表示一个通用的类型说明符。在使用模板时,使用实际的类型替换它。

如果在类声明中定义了方法(内联定义),则可以省略模板前缀和类限定符。

模板类不是函数,不能单独编译。

模板必须和特定的模板实例化请求一起使用。一般是使将所有模板信息放在一个头文件中。

6.2 使用模板类

声明模板类的对象,必须显式地提供所需的类型

Stack<int> kernels; // 存储int类型的栈类

6.3 数组模板和非类型参数

template <class T, int n>
  • class 指出T为类型参数,int指出n的类型。这种参数称为非类型(non-type)表达式参数
  • 表达式参数可以是整型枚举引用指针

模板代码不能修改参数的值,也不能使用参数的地址。

实例化模板时,用做表达式参数的值必须是常量表达式#define或者const定义的常数)。

  • 表达式参数的优缺点
    • 优点
      • 构造函数使用new和delete来管理堆内存,但它为自动变量维护的内存栈,使得执行速度更快。
    • 缺点
      • 每种数组大小都会生成自己的模板。

6.4 模板多功能性

模板类的三个功能:

  • 用作基类

    template <typename Type>
    class GrowArray : public Array <Type> {...};

  • 用作组件类

    • 模板可以包含多个类型参数。
      template <class T1, class T2>
      {private:T1 a;T2 b;public:T1 & first();T2 & second();...
      };

  • 默认类型模板参数

    • 可以为类型参数提供默认值
      template <class T1, class T2 = int> class Topo {...};
      // 如果省略了T2的值,编译器会默认使用 int
    • 不能为函数模板参数提供默认值。但可为非类型参数提供默认值。

6.5 模板的具体化

隐式实例化显式实例化显式具体化,统称为 具体化 。

模板使用 泛型 的方式描述类具体化是使用具体化的类型生成类声明

  • 隐式实例化

    • 声明一个或多个对象,指出所需的类型,而编译器使用通用模板提供的处方生成具体的类定义。

      ArrayTP <int, 100> stuff;

  • 显式实例化

    • 当使用关键字 template 并指出所需类型来声明类时,编译器将生成类声明的显式实例化。
    • 声明必须位于模板定义所在的名称空间中。
      template class ArrayTP<string, 100>; // 虽然没有创建或提及类对象,编译器也将生成类声明(包括方法定义)

  • 显式具体化

    • 格式如下:
      template <> class Classname <specialized-type-name> {...};
      // 显式具体化的例子
      template <> class Pair<int,int> {...};

  • 部分具体化

    • 部分限制模板的通用性。
      // 通用模板
      template <class T1, class T2> class Pair {...};
      // 
      template <class T1> class Pair<T1,int> {...}; // T1 保持不变,但是T2 被具体化为 int

    • 关键字 template 后面的 <>声明 的是没有被具体化的类型参数。
    • 如果多个模板可供选择,编译器将优先使用具体化程度最高的模板。
    • 如果提供的类型不是指针,则编译器将使用通用版本。
    • 日过提供的是指针,则编译器将使用指针具体化版本

6.6 成员模板

模板可用作结构、类或模板类的成员。

// template member
#include <iostream>
using std::out;
using std::cin;
using std::endl;template <typename T>
class beta
{private:template <typename V> // class hold{private:V val;public:hold(V v = 0) : val(v) {}void show() const {cout << val << endl; }V value() const {return val;}};hold<T> q;    // template objecthold<int> n; // template objectpublic:beta(T t, int i) : q(t), n(i) {}template<typename U> // template methodU blab(U u,T t) {return (n.Value() + q.Value() * u / t;}void Show() const {q.Show(); n.Show();}
};

模板可以嵌套,所以语法为:

template <typename T>template <typename V>
// 不能使用如下语法
template<typename T, typename V>

6.7 使用模板作为参数

模板可以包含 类型参数(typename T) 和 非类型参数(int n)

示例:

template <template <typename T> class Thing>
class Grab
  • 模板参数是 template class Thing,其中template class 是类型,Thing 是参数。

6.8 模板类和友元

模板类声明也可以友元。模板的友元分为3类:

  • 非模板友元

    • 在模板类中声明的一个常规友元函数,称为模板所有实例化的友元。
      template<class T>
      class HasFriend
      {public:friend void counts();...
      };

    • 当为友元函数提供模板类参数,必须指明具体化。
      template <class T>
      class HasFriend
      {friend void report(HasFriend<T> &);// 具体化之后,就会变成约束模板友元
      };

  • 约束模板友元:友元的类型取决于类被实例化时的类型。

    • 类外声明的模板具体化
    • 2个步骤:
      • 在类定义的前面声明每个模板函数
        template <typename T> void counts();
        template <typename T> void reports(T &);

      • 在函数中再次将模板声明为友元。根据类模板参数的类型声明具体化。
        template <typename TT>
        class HasFriendT
        {friend void counts<TT>();friend void report <HasFriendT<TT> &>;...
        };

  • 非约束模板友元:友元的所有具体化都是类的每一个具体化的友元。

    • 类内部声明模板,可以创建非约束友元函数
      template <typename T>
      class ManyFriend
      {template <typename C,Typename D> friend void show2(C &, D &)...
      };
      // 实现使用方式
      template <typename C, typename D> void show2(C & c, D & d)
      {...
      }

6.9 模板别名(C++11)

  • 使用 typedef 为模板具体化指定别名

    typedef std::array<double,12> arrd;
    arrd gallons; // gallon type : std::array<double,12>
  • 使用 using name = type 于非模板,此时与常规的typedef等价。

    template <typename T>
    using arrtype = std::array<T,12>; // arrtype定义为一个模板别名

相关文章:

C++ Primer Plus第十四章笔记

目录 1.包含对象成员的类 valarray类简介 1.2 Student类的设计 1.3 接口和实现 1.4 C和约束 2. 私有继承 2.1 私有继承和组合的异同 2.2 初始化基类组件 2.3 访问基类的方法 2.4 访问基类对象 2.5 访问基类的友元函数 2.5 使用组合还是私有继承 3. 保护继承 4. 使…...

CentOS 7 mini 运行环境搭建与测试——CentOS Mini 安装ifconfig工具【云原生开发部署实践笔记】

云原生开发部署实践笔记 一、开发测试环境搭建与测试 1.1 Linux运行环境的搭建与测试 虽然CentOS已经更新到Stream 9 版本&#xff0c;但基于大多数企业和单位多数使用CentOS 7版本作为运行底座&#xff0c;7版本也一直在更行维护&#xff0c;此实践基于CentOS 7 Mini版本搭…...

案例061:基于微信小程序的互助学习系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…...

【ELK03】ES 索引的Mapping映射详解、数据类型和settings属性设置

一、ES 索引的映射和设置 1.MAPPING 映射(MAPPING)就是es中一个决定了文档如何存储,如何生成索引,字段各种类型定义的过程.类似于我们在关系型数据库中创建一个表格数据之前先定义表格有哪些字段,每个字段是什么类型,然后数据会按照这个配置写入表格,ES中同样是这个过程,它由…...

线性代数入门与学习笔记

该内容为重拾部分线性代数知识的学习笔记&#xff0c;内容上更多的是为了解决问题而学习的内容&#xff0c;并非系统化的学习。 针对的问题为&#xff1a;Music算法推导求解过程中的矩阵计算知识。 学习的内容包括&#xff1a;矩阵原理、矩阵行列式、矩阵的秩、线性变换矩阵变换…...

Linux安全学习路标

1. 操作系统基础知识 首先&#xff0c;你需要建立坚实的操作系统基础知识&#xff0c;包括Linux文件系统和目录结构、Linux进程管理、权限管理等基本概念。 2. 网络和通信安全 学习关于网络和通信安全的基础知识&#xff0c;包括TCP/IP协议栈、网络攻击类型、防火墙配置、网…...

常见的中间件--消息队列中间件测试点

最近刷题&#xff0c;看到了有问中间件的题目&#xff0c;于是整理了一些中间件的知识&#xff0c;大多是在小破站上的笔记&#xff0c;仅供大家参考~ 主要分为七个部分来分享&#xff1a; 一、常见的中间件 二、什么是队列&#xff1f; 三、常见消息队列MQ的比较 四、队列…...

【USRP】5G / 6G OAI 系统 5g / 6G OAI system

面向5G/6G科研应用 USRP专门用于5G/6G产品的原型开发与验证。该系统可以在实验室搭建一个真实的5G 网络&#xff0c;基于开源的代码&#xff0c;专为科研用户设计。 软件无线电架构&#xff0c;构建真实5G移动通信系统 X410 采用了目前流行的异构式系统&#xff0c;融合了FP…...

ubuntu20.04设置开机自启动jar(依赖其他服务)

目的&#xff1a; 有的时候我们的项目是部署在物理机上给其他公司员工使用&#xff0c;对于他们来说操作越简单越好。所以我需要实现将我的jar部署在ubuntu上&#xff0c;实现开机自启。&#xff08;我的项目依赖emqx服务&#xff09;。 步骤&#xff1a; 切换到system目录 …...

【GEE笔记】在线分类流程,标注样本点、分类和精度评价

GEE在线分类流程 介绍 GEE&#xff08;Google Earth Engine&#xff09;是一个强大的地理信息处理平台&#xff0c;可以实现在线的遥感影像分析和处理。本文将介绍如何使用GEE进行在线的分类流程&#xff0c;包括标注样本点、分类和精度评价。本文以2020年5月至8月的哨兵2影像…...

MATLAB基础运算

矩阵和数字相乘 就是矩阵里面每个元素跟这个数字乘一遍 矩阵和矩阵相乘 能不能相乘&#xff0c;需要前面矩阵的列数等于后面矩阵的行数&#xff0c;出来的矩阵大小是前面矩阵的行数*后面矩阵的列数。 所以大家会发现&#xff0c;矩阵相乘如果前后调转了&#xff0c;结果会完全…...

Linux DAC权限的简单应用

Linux的DAC&#xff08;Discretionary Access Control&#xff09;权限模型是一种常见的访问控制机制&#xff0c;它用于管理文件和目录的访问权限。作为一名经验丰富的Linux系统安全工程师&#xff0c;我会尽可能以简单明了的方式向计算机小白介绍Linux DAC权限模型。 在Linu…...

JVS低代码表单引擎:数据校验与处理的先锋

随着信息技术的迅速发展&#xff0c;数据校验与处理已经成为了各类应用中不可或缺的一环。尤其是在涉及敏感信息&#xff0c;如密码处理时&#xff0c;其安全性和准确性显得尤为重要。JVS低代码表单引擎提供了强大的文本组件触发逻辑校验功能&#xff0c;它能够在用户填写数据的…...

clickhouse删除partition分区数据

clickhouse分布式表tencent_table_20231208_DIST&#xff0c;本地表tencent_table_20231208_local&#xff1b; 30台clickhouse存储服务器&#xff1b; 本地表&#xff1a;tencent_table_20231208_local CREATE TABLE tencent_sz.tencent_table_20231208_local (id Int64 DEFA…...

持续集成交付CICD:CentOS 7 安装 Nexus 3.63

目录 一、实验 1.CentOS 7 安装Nexus3.63 二、问题 1.安装Nexus报错 2.Nexus启动停止相关命令 一、实验 1.CentOS 7 安装Nexus3.63 &#xff08;1&#xff09;当前操作系统版本&JDK版本 cat /etc/redhat-releasejava -version&#xff08;2&#xff09;下载Nexus新…...

Apache Flink(十):Flink集群基础环境搭建-JDK及MySQL搭建

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录...

LVS-DR+Keepalived+动静分离实验

架构图 解释一下架构&#xff0c;大概就是用Keepalived实现两台DR服务器的LVS负载均衡&#xff0c;然后后端服务器是两台Nginx服务器两台Tomcat服务器并且实现动静分离这个实验其实就是把 LVS-DRKeepalived 和 动静分离 给拼起来&#xff0c;真的是拼起来&#xff0c;两个部分…...

java面试题-Hashmap、Hashtable、ConcurrentHashMap原理

远离八股文&#xff0c;面试大白话&#xff0c;通俗且易懂 看完后试着用自己的话复述出来。有问题请指出&#xff0c;有需要帮助理解的或者遇到的真实面试题不知道怎么总结的也请评论中写出来&#xff0c;大家一起解决。 java面试题汇总-目录-持续更新中 Hashmap和hashtable存储…...

数据可视化:解锁企业经营的智慧之道

在现代企业管理中&#xff0c;数据可视化已经成为了一项重要的工具。它不仅仅是简单地展示数据&#xff0c;更是提供了深入理解数据、做出更明智决策的方法。作为一名可视化设计从业人员&#xff0c;我经手过一些企业自用的数据可视化项目&#xff0c;今天就来和大家聊聊数据可…...

JVM 性能调优

概述篇 面试题 讲讲你理解的性能评价及测试指标&#xff1f;&#xff08;瓜子&#xff09; 生产环境中的问题 生产环境发生了内存溢出该如何处理&#xff1f;生产环境应该给服务器分配多少内存合适&#xff1f;如何对垃圾回收器的性能进行调优&#xff1f;生产环境CPU负载飙高…...

linux常用命令-yum命令详解(超详细)

文章目录 前言一、yum命令介绍1. yum命令简介2. yum命令的基本语法3. 常用的yum命令选项4. 常用的yum命令参数 二、yum命令示例用法1. 安装软件包2. 更新软件包3. 删除软件包4. 搜索软件包5. 列出已安装的软件包6. 列出可用的软件包7. 清理缓存8. 禁用软件包仓库 总结 前言 yu…...

解决 Element-ui中 表格(Table)使用 v-if 条件切换后,表格的列的筛选不显示了

解决方法 在每个需要使用 v-if 或 v-else 的 el-table-column 上增加 key 作为唯一标识&#xff0c;这样渲染的时候就不会因为复用原则导致列数据混乱了。关于key值&#xff0c;一般习惯使用字段名&#xff0c;也可随机生成一个值&#xff0c;只要具有唯一性就可以。...

Navicat 技术指引 | 适用于 GaussDB 分布式的自动运行功能

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结…...

爬虫 selenium语法 (八)

目录 一、为什么使用selenium 二、selenium语法——元素定位 1.根据 id 找到对象 2.根据标签属性的属性值找到对象 3.根据Xpath语句获取对象 4.根据标签名获取对象 5.使用bs语法获取对象 6.通过链接文本获取对象 三、selenium语法——访问元素信息 1.获取属性的属性值…...

NTP时钟同步服务器(校时服务器)技术参数分享

NTP时钟同步服务器&#xff08;校时服务器&#xff09;技术参数分享 网络校时服务器是一款先进的智能化高精度时钟同步设备。 网络校时服务器从 GPS、北斗、GLONASS、Galileo等导航定位卫星系统上获取标准时间信息&#xff0c;并通过 NTP/SNTP 或其他网络协议&#xff0c;在网络…...

JDBC详解——增删改查(CRUD)、sql注入、事务、连接池

1. 概念&#xff1a; Java DataBase Connectivity&#xff0c; Java 数据库连接&#xff0c; Java语言操作数据库 JDBC本质&#xff1a;其实是官方&#xff08;sun公司&#xff09;定义的一套操作所有关系型数据库的规则&#xff0c;即接口。各个数据库厂商去实现这套接口&…...

K-means算法通俗原理及Python与R语言的分别实现

K均值聚类方法是一种划分聚类方法&#xff0c;它是将数据分成互不相交的K类。K均值法先指定聚类数&#xff0c;目标是使每个数据到数据点所属聚类中心的总距离变异平方和最小&#xff0c;规定聚类中心时则是以该类数据点的平均值作为聚类中心。 01K均值法原理与步骤 对于有N个…...

使用 db2diag 工具来分析 db2diag 日志文件

供数据库和系统管理员使用的主日志文件为管理通知日志。db2diag 日志文件旨在供 IBM 软件支持机构用于进行故障诊断。 管理通知日志消息也以标准化消息格式记录到 db2diag 日志文件。 db2diag 工具用于对 db2diag 日志文件中的大量信息进行过滤和格式化。过滤 db2diag 日志文…...

在Pytorch中使用Tensorboard可视化训练过程

这篇是我对哔哩哔哩up主 霹雳吧啦Wz 的视频的文字版学习笔记 感谢他对知识的分享 本节课我们来讲一下如何在pytouch当中去使用我们的tensorboard 对我们的训练过程进行一个可视化 左边有一个visualizing models data and training with tensorboard 主要是这么一个教程 那么这里…...

Redis 命令全解析之 Hash类型

文章目录 ⛄介绍⛄命令⛄RedisTemplate API⛄应用场景 ⛄介绍 Hash类型&#xff0c;也叫散列&#xff0c;其value是一个无序字典&#xff0c;类似于Java中的 HashMap 结构。 String结构是将对象序列化为JSON字符串后存储&#xff0c;当需要修改对象某个字段时很不方便&#xf…...

postgresql数据库配置主从并配置ssl加密

1、先将postgresql数据库主从配置好 参考&#xff1a;postgresql主从配置 2、在主节点配置ssl加密&#xff0c;使用navicat测试是否可以连接 参考&#xff1a;postgresql配置ssl 3、正常连接无误后&#xff0c;将root.crt、server.crt、server.key复制到从数据库节点的存储…...

IO多路转接之select

IO多路转接之select 1. IO多路转接&#xff08;复用&#xff09;2. select2.1 函数原型2.2 细节描述 3. 并发处理3.1 处理流程3.2 通信代码 原文链接 1. IO多路转接&#xff08;复用&#xff09; IO多路转接也称为IO多路复用&#xff0c;它是一种网络通信的手段&#xff08;机…...

linux如何删除大文件的第一行(sed)

可以用sed命令实现&#xff1a; 删除文档的第一行 1. sed -i 1d <file>删除文档的最后一行 1. sed -i $d <file>在文档指定行中增加一行 # 示例如下&#xff1a; echo "1"; echo "2"; echo "4"; echo "5"; # 想要在echo…...

Navicat 技术指引 | 适用于 GaussDB 分布式的备份/还原功能

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结…...

【广州华锐互动VRAR】VR戒毒科普宣传系统有效提高戒毒成功率

随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已经逐渐渗透到各个领域&#xff0c;为人们的生活带来了前所未有的便利。在教育科普领域&#xff0c;VR技术的应用也日益广泛&#xff0c;本文将详细介绍广州华锐互动开发的VR戒毒科普宣传系统&#xff0…...

守护安全,六氟化硫气体泄漏报警装置校准服务

在电力工业中&#xff0c;六氟化硫&#xff08;SF6&#xff09;气体是一种重要的介质&#xff0c;它用作封闭式中、高压开关的灭弧和绝缘气体。六氟化硫气体的卓越性能实现了装置经济化、低维护化的操作。与普通装置相比&#xff0c;可以节省最多90&#xff05;的空间。 六氟化…...

概率测度理论方法(第 2 部分)

一、说明 欢迎回到这个三部曲的第二部分&#xff01;在第一部分中&#xff0c;我们为测度论概率奠定了基础。我们探索了测量和可测量空间的概念&#xff0c;并使用这些概念定义了概率空间。在本文中&#xff0c;我们使用测度论来理解随机变量。 作为一个小回顾&#xff0c;在第…...

实战:Docker Compose 下 Nginx、Java、Mysql 和 Redis 服务协同部署(包含解决浏览器访问Linux部署服务器本地资源问题)

1. 背景 在该实战中&#xff0c;我们将探讨如何使用Docker Compose协同部署Nginx、Java、Mysql和Redis服务&#xff0c;实现一个视频上传与展示的应用。具体需求如下&#xff1a; Java应用负责上传视频和图片资源到Nginx目录下&#xff0c;作为资源服务器。Nginx服务作为静态…...

Docker 设置国内镜像源

Docker 设置国内镜像源 您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器 具体配置如下&#xff1a; {"registry-mirrors" : ["https://registry.docker-cn.com","http://hub-mirror.c.163.com","https://docker.mirro…...

通信协议 远程调用RPC

1.通讯协议 所有的HDFS通讯协议都是建立在TCP/IP协议之上。 客户端通过一个可配置的TCP端口连接到Namenode&#xff0c;通过ClientProtocol协议与Namenode交 互。而Datanode使用DatanodeProtocol协议与Namenode交互。 一个远程过程调用(RPC)模型被抽象出来封装ClientProtoc…...

决策树 算法原理

决策树 算法原理 决策树的原理 决策树: 从训练数据中学习得出一个树状结构的模型 决策树属于判别模型 决策树是一种树状结构&#xff0c;通过做出一系列决策 (选择) 来对数据进行划分&#xff0c;这类似于针对一系列问题进行选择。 决策树的决策过程就是从根节点开始&#…...

Git全局设置命令---设置提交人邮箱

介绍 使用git命令设置提交人邮箱。 命令 git config --global user.email "xxxxxxxx.com"...

3DCAT+上汽奥迪:打造新零售汽车配置器实时云渲染解决方案

在 5G、云计算等技术飞速发展的加持下&#xff0c;云渲染技术迎来了突飞猛进的发展。在这样的背景下&#xff0c;3DCAT应运而生&#xff0c;成为了业内知名的实时云渲染服务商之一。 交互式3D实时云看车作为云渲染技术的一种使用场景&#xff0c;也逐步成为一种新的看车方式&a…...

物联网+AI智慧工地云平台源码(SaaS模式)

智慧工地云平台充分运用数字化技术&#xff0c;聚焦施工现场岗位一线&#xff0c;依托物联网、互联网、AI等技术&#xff0c;围绕施工现场管理的人、机、料、法、环五大维度&#xff0c;以及施工过程管理的进度、质量、安全三大体系为基础应用&#xff0c;实现全面高效的工程管…...

python打开相机,用鼠标左键框选矩形区域,支持一次框选多个矩形区域,通过鼠标右标清除上一次画的矩形。

方案一 import cv2# Global variables rectangles [] current_rectangle [] drawing False# Mouse callback function def mouse_callback(event, x, y, flags, param):global rectangles, current_rectangle, drawingif event cv2.EVENT_LBUTTONDOWN:drawing Truecurren…...

卷积之后通道数为什么变了

通道数增多与卷积之后得到的图像特征数量有关 卷积层的作用本来就是把输入中的特征分离出来变成新的 feature map&#xff0c;每一个输出通道就是一个卷积操作提取出来的一种特征。在此过程中ReLU激活起到过滤的作用&#xff0c;把负相关的特征点去掉&#xff0c;把正相关的留…...

ubuntu18.04安装opencv-4.5.5+opencv_contrib-4.5.5

一、安装opencv依赖 sudo apt-get install build-essential sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-d…...

实验3.5 路由器的单臂路由配置

实验3.5 路由器的单臂路由配置 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施1.SWA的基本配置2.RA的基本配置3.在RA上查看接口状态 六、任务验收七、任务小结 一、任务描述 某公司对部门划分了需VLAN之后&#xff0c;发现两个部门之间无法通信&#xff0c;但…...

nodejs微信小程序+python+PHP的基于大数据的家电销售分析系统设计与实现-计算机毕业设计推荐django

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…...

Windows server flask

1、Windows server 通过python的flask执行命令 from flask import Flask, request, abort import subprocess from flask_basicauth import BasicAuth app Flask(__name__) # 获取url是进行账号密码认证&#xff0c;设置url的账号密码 app.config[BASIC_AUTH_USERNAME] 账号…...