C++期末整理
课堂笔记
构造与析构
#include <iosteam>
#include <cstring>
using namespace std;struct Date
{int y, m, d;void setDate(int, int, int);Date(int yy, int mm, int dd) {y = yy, m = mm, d = dd;}
};class Student
{
private:char* name;Date birthday;
public:// 如果没写不带参数的构造函数,系统会提供一个不带参数的构造函数,称为缺省构造函数,或者是拷贝构造函数Student(const Student&); // 拷贝构造函数,当有new和delete的时候要写Student():birthday(2000, 3, 4) {} // 不带参数的构造函数Student(char*, int, int, int);~Student() {delete []name;} // 与构造函数成对出现
};Student::Student & operator = (const Student &s1) // 运算符重载函数
{name = new char[strlen(s1.name) + 1];strnpy(name, s1.name, strlen(s1.name));birthday = s1.birthday;return *this;
}Student::Student(const Student &s1) // 拷贝构造函数:birthday(s1.birthday) // 初始化
{// name = s1.name; // 错误 name = new char[strlen(s1.name) + 1];// name = s1.name; 错误,没用到新开辟的空间strncpy(name, s1.name, strlen(s1.name));
}Student:: Student(char* p, int y, int m, int d): birthday(y, m, d) // 初始化
{// name = p; 不好,指针会改变// name = new char[sizeof(p)]; // 指针的大小,一般为8个字节,但不是字符串的长度name = new char[strlen(p) + 1]; // 多一个位置存放'\0'strncpy(name, p, strlen(p));
};void print(Student s)
{cout << s,name << endl; // error,私有的,不能访问
}int main()
{const char *p = "zhangsan";Student s1((char*)p, 2000, 3, 4); // 强制类型转换// Student *s;// s = new Student[10000]; // 调用不带参数的构造函数10000次Student s2(s1); // 调用拷贝构造函数// print(s1); // 也会调用拷贝构造函数Student s3;s3 = s1; // 运算符重载return 0;
}
静态与友元
#include <iostream>
using namespace std;class Student;
class Date
{string printDate(Student*);
};int studentCount()
{static int count = 0; // 静态变量,一直存在,可以理解成全局变量,生命周期和全局变量一样,但只能在函数中使用count++;return count;
}class Student
{
private:string name; // 比字符串好操作int num;int age;static int count; // 全班的同学数目static int totalage;
public:Student(string, int, int);void total(); // 成员函数,有一个隐藏的参数,this指针static float averageAge(); // 静态函数,无this指针// friend是单向的friend void print(Student *); // 友元函数,无this指针,一般的,友元函数里面一般有一个参数,指针或者引用friend string Date::printDate(Student*);friend Date; // Date里边所有的函数都是我的朋友,一般不建议
};Student::Student(string name1, int num1, int age1):name(name1), num(num1);
{age = age1; // 和上面的初始化方法的结果及作用相同
}void Student::total()
{totalage += age;count++;
}float Student::averageAge() // 静态函数
{// cout << age; // error,静态函数不能访问类里边的age变量,因为没有this指针return totalage / count;
}int Student::count = 0; // 静态变量的初始化
int Student::totalage = 0;void print(Student *s) // 全局函数,参数*s也可以写成&s,下面的"->"改成"."
{s.name = string("class") + s.name; // 可以修改类里面的私有变量的值cout << s -> name<< s -> num<< s -> age;
}int main()
{Student s[3] = {Student("zhang", 202301, 18),Student("li", 202302, 19),Student("wang", 202303, 18)};for (int i = 0; i < 3; i++){s[i].total();}Student st0(s[0]);Student st1("liu", 202304, 17);st1 = st0;cout << "average age = " << Student::averageAge(); // 调用静态函数的标准写法cout << "average age = " << s[0].averageAge(); // 也是正确的,但是不建议用,具有误导性return 0;
}
string
#include <iosteam>
using namespace std;int main()
{string s1;string s2("hello world\n");cout << s2[4]; // 打印s2里边的第四个字符,也是一个函数,运算符函数s1 = s1 + s2;cout << s1;
}
继承
#include <iostream>
using namespace std;class Student
{
private:
protected: // 继承者可以访问string name; // 比字符串好操作int num;int age;
public:// 当父类的构造函数被调用时,它的子类构造函数会被自动调用,跟析构函数的调用相反Student(string, int, int);void print1() {cout << name << num << age;}~Student() {cout << "Destruct Student\n";}
};Student::Student(string name1, int num1, int age1):name(name1), num(num1);
{age = age1; // 和上面的初始化方法的结果及作用相同cout << "Construct Student\n";
}class IOTStudent : public Student // 常用public表示继承,如果不写public,则默认为private,但是也没有意义
{
private:int cpp;
public:IOTStudent(string, int, int, int, int);void print() {cout << name << num << age << cpp;} // 可以访问父类的变量,如果是private则不可以访问// 所有的子类被调用析构函数时,他的父类析构函数也会被自动调用~IOTStudent() {cout << "Destruct IOTStudent\n";}
};// 子类必须为父类提供参数
IOTStudent::IOTStudent(string name1, int num1, int age1, int cpp): Student(name1, num1, age1) // 调用Student的有参构造函数
{cpp = cpp1;cout << "Construct IOTStudent\n";
}void f(Student *p) // 根据p的数据类型来判断调用什么输出函数
{p->print();
}int main()
{// 指针不会产生构造函数// 父类的指针比较好用Student s1("zhang", 20230001, 19), *p1; // p1不会调用构造和析构函数IOTStudent s2("li", 20230002, 19, 86), *p2; // s2先调用一个父类的构造函数,再构造子类的构造函数// 先调用s2的子类的析构函数,再调用s2的父类的析构函数,最后调用s1的父类的析构函数f(&s1); // 打印父类的打印函数f(&s2); // 打印父类的打印函数,因为静态联编p1 = &s1;p1->print(); // 打印出父类的打印函数p1 = &s2;/* 还是打印父类的打印函数,因为p1是Student类型的指针变量,静态编译,此时编译器不知道p1指向的是哪一个地方,编译器只能通过p1的数据类型来判断指向哪一片区域*/p1->print();IOTStudent *p2;p2 = &s2; // 不能指向s1p2->print(); // 想要调用子类的打印函数只能通过定义一个子类的数据类型的变量s1 = s2; // right,但是没有实用价值p1 = &s1; // 取s1的地址p2 = &s2;p1 = &s2; // rightp2 = &s1; // error,子类的指针指向父类的地址是错误的,cpp会变成随机数p1 = p2; // rightp2->print(); s2 = s1; // error,最后一个cpp的空间为随机数cout << "size of Student is:" << sizeof(Student) << endl;cout << "size of IOTStudent is:" << sizeof(IOTStudent) << endl;cout << s2.name; // errors2.print(); // 打印IOTStudent里的打印函数(就近原则)s2.print1(); // 打印Student里的打印函数,可以调用父类的函数,可以通过改函数名来区分s2.Student::print(); // 指定调用STudent父类里边的打印函数,"::"表示预操作符return 0;
}
动态联编
#include <iostream>
using namespace std;class Student
{
private:
protected: // 继承者可以访问string name; // 比字符串好操作int num;int age;
public:// 当父类的构造函数被调用时,它的子类构造函数会被自动调用,跟析构函数的调用相反Student(string, int, int);// 动态联编,或者是多态// 需要父类和子类的函数头,参数完全相同virtual void print() {cout << name << num << age;} // 虚函数,父类的函数是虚函数,子类的相同的函数也是虚函数~Student() {cout << "Destruct Student\n";}
};Student::Student(string name1, int num1, int age1):name(name1), num(num1);
{age = age1; // 和上面的初始化方法的结果及作用相同cout << "Construct Student\n";
}class IOTStudent : public Student // 常用public表示继承,如果不写public,则默认为private,但是也没有意义
{
private:int cpp;
public:IOTStudent(string, int, int, int, int);virtual void print() {cout << name << num << age << cpp;} // 可以访问父类的变量,如果是private则不可以访问// 所有的子类被调用析构函数时,他的父类析构函数也会被自动调用~IOTStudent() {cout << "Destruct IOTStudent\n";}
};// 子类必须为父类提供参数
IOTStudent::IOTStudent(string name1, int num1, int age1, int cpp): Student(name1, num1, age1) // 调用Student的有参构造函数
{cpp = cpp1;cout << "Construct IOTStudent\n";
}void f(Student *p) // 根据p的数据类型来判断调用什么输出函数
{p->print();
}int main()
{// 指针不会产生构造函数// 父类的指针比较好用Student s1("zhang", 20230001, 19), *p1; // p1不会调用构造和析构函数IOTStudent s2("li", 20230002, 19, 86), *p2; // s2先调用一个父类的构造函数,再构造子类的构造函数// 先调用s2的子类的析构函数,再调用s2的父类的析构函数,最后调用s1的父类的析构函数Student *p1;p1 = &s2;f(p1); // 调用父类的函数输出IOTStudent *p2;p2 = &s2;f(p2); // 调用父类的函数输出,因为输出什么类型唯一的判断标准是f函数的参数类型// 希望这个指针所指向的对象是什么类型的,就调用什么类型的输出函数,就需要使用动态联编,virtualStudent *p;p = &s1;p -> print();p = &s2;p -> print();return 0;
}
动态联编的例子
#include <iostream>
using namespace std;class Shape
{
protected:double L, H;
public:void init() {cout << "input L=";cin >> L;cout << "input H=";cin >> H;}/*如果在基类里面有纯虚函数,则他的派生类必须实现这个函数,如果不实现,则编译会报错且基类不能有实例e.g. Shape s; // errors.area(); // error*/virtual double area() = 0; // 不是返回0的意思,意思是不写这个函数,也叫纯虚函数
};class Tr : public Shape // 三角形
{
public:virtual double area() {return L * H / 2;}
};class Re : public Shape // 矩形
{
public:virtual double area() {return L * H;}
};class Ci : public Shape // 圆
{
public:virtual double area() {return 3.14 * 3.14 * L;}
};int main()
{Shape *p; // 父类指针好用for (int i = 0; i < 5; i++){char c;cout << "\ninput shape type";cin >> c;if (c == 'T'){p = new Tr;}else if (c == 'R'){p = new Re;}else if (c == 'C'){p = new Ci;}else{break;}p->init(); // 初始化,在函数中输入长度和宽度cout << "\narea of p is:" << p->area();}delete p;return 0;
}
+±-重载
#include <iostream>
using namespace std;class Complex
{
private:double x, y;
public:Complex(double xx = 0, double yy = 0); // 如果不写参数,则默认他的xx和yy都默认为0,默认调用缺省构造函数void print();Complex& operator++();Complex operator++(int);friend Complex& operator--(Complex& c);
};Complex::Complex(double xx = 0, double yy = 0) // 如果不写参数,则默认他的xx和yy都默认为0
{x = xx;y = y;
}void Complex::print()
{cout << x;if (y > 0){cout << "+" << y << 'i';}else if (y < 0){cout << y << 'i';}
}Complex& operator++()
{x++;return *this;
}Complex Complex::operator++(int) // 不能返回引用,因为生存周期问题,函数结束后,指针消失,所以不能返回一个指针
{Complex temp(*this); // 把自己拷贝x++;return temp;
}Complex& operator--(Complex& c)
{c.x -= 1;return c;
}int main()
{Complex c2(1.1, -2.2);++c2; // 调用函数Complex& operator++();cout << c2 << endl;c2++; // 调用函数Complex operator++(int)cout << c2;--c2;cout << c2;return 0;
}
函数模板
// 函数的模板放在.h文件里面
#include <iostream>
using namespace std;class Complex
{
private:double x, y;
public:Complex(double xx = 0, double yy = 0); // 如果不写参数,则默认他的xx和yy都默认为0,默认调用缺省构造函数bool operator> (Complex& c);friend ostream& operator<< (ostream&, const Complex&);
};Complex::Complex(double xx = 0, double yy = 0) // 如果不写参数,则默认他的xx和yy都默认为0
{x = xx;y = y;
}Complex operator>(bool& c)
{return (x * x + y * y > c.x * c.x + c.y * c.y) ? this : c;
}ostream& operator<< (ostream& o, const Complex& c)
{o << c.x;if (c.y > 0){o << '+' << c.y << 'i';}else if (c.y < 0){o << c.y << 'i';}return o;
}/*
int Max(int x, int y);
float Max(float x, float y);
char Max(char x, char y);
Complex Max(Complex x, Complex y);int Max(int x, int y)
{return (x > y) ? x : y;
}float Max(float x, float y)
{return (x > y) ? x : y;
}char Max(char x, char y)
{return (x > y) ? x : y;
}
*/template <typename T1> // 放在头文件里面
T1 Max (T1 x, T1 y)
{return (x > y) ? x : y;
}int Max(int x, int y)
{return (x > y) ? x : y;
}int main()
{int i1 = 4, i2 = 6;cout << Max(i1, i2) << endl;float f1 = 1.2, f2 = 2.3;cout << Max(f1, f2) << endl;char c1 = 'a', c2 = 'x';cout << Max(c1, c2) << endl;// cout << Max(i1, f2) << endl; // 调用int Max(int x, int y)函数,做了一个函数重载Complex com1;// Complex (1);com1 = 1; // x = 1, y = 0,实际上调用构造函数,把1传进去Complex com(1), com(1.1, 1.2);cout << Max(com1, com2) << endl; // <<, >重载return 0;
}
类的模板
// 类的模板放在.h文件里面,模板都放在头文件(.h)里面
#include <iostream>
using namespace std;template <typename T2>
class List
{
private:int n;T2 *v;
public:List(int x);~List();T2& operator [](int x);int search(T2 value);
};template <typename T2>
List<T2>::List(int x)
{n = x;v = new T2[n];
}template <typename T2>
List<T2>::~List()
{delete []v; // 如果不写中括号,申请的内存依旧会被释放,有[],会调用n次析构函数,如果没有,只调用一次
}T2& List<T2>::operator [](int x)
{return v[x];
}template <typename T2>
int List<T2>::search(T2 value)
{for (int i = 0; i < n; i++){if (v[i] == value) // 在Complex中增加"=="运算符重载{return i;}}return -1;
}int main()
{typedef List<int> ilist;ilist il2(57);List<int> il1(57); // 与上式作用相同,同时调用构造函数List<float> fl1(58);fl1[20] = 5.0;List<Complex> c1(59); // 嵌套函数模板return 0;
}//----------------------------------------------分割线---------------------------------------------------------//template <typename T1>
class Mylnt
{
private:T1 t1, t2, t3;
public:Mylnt();Mylnt(T1 t1_value, T1 t2_value, T1 t3_value);T1 getMax();T1 getMin();void sort();void show();
};template <typename T1>
Mylnt<T1>::Mylnt(T1 t1_value, T1 t2_value, T1 t3_value)
{t1 = t1_value;
}template <typename T1>
T1 Mylnt<T1>::getMax()
{T1 max;if (t1 >= t2){if (t1 > t3){max = t1;}else{max = t3;}}else{if (t2 > t3){max = t2;}else{max = t3;}}
}
运算符重载
#include <iostream>
using namespace std;class Complex
{
private:double x, y;
public:Complex(double xx = 0, double yy = 0); // 如果不写参数,则默认他的xx和yy都默认为0,默认调用缺省构造函数void print();// 返回一个引用或者指针的话的话,不能返回一个临时变量,因为指针指向一个临时变量的地址,函数结束后,地址消失,堆栈地址失效Complex& add(const Complex& c2);Complex& operator+=(const Complex& c2); // 运算符重载函数,但是名字固定,功能和上面的函数一样,参数也一样,只是名字不同Complex operator+(const Complex& c2); // 有两个参数,但是有一个是他自己,所以省略,返回不写引用friend Complex operator-(const Complex& c1, const Complex& c2); // 没有this指针,所以要把对象传进去,多一个他自己参数
};Complex::Complex(double xx = 0, double yy = 0) // 如果不写参数,则默认他的xx和yy都默认为0
{x = xx;y = y;
}void Complex::print()
{cout << x;if (y > 0){cout << "+" << y << 'i';}else if (y < 0){cout << y << 'i';}
}Complex& Complex::add(const Complex& c2) // add函数不允许修改c2的内容,返回一个引用
{x += c2.x;y += c2.y;return Complex(x, y); // error,因为这个变量的生命周期结束了return *this; // 把自己传出去
}Complex& Complex::operator+=(const Complex& c2) // 运算符重载函数,但是名字固定,功能和上面的函数一样,参数也一样,只是名字不同
{x += c2.x;y += c2.y;return *this; // 把自己传出去
}Complex Complex::operator+(const Complex& c2) // 返回不写引用,因为不希望改c1的内容,
{Complex temp;temp.x = c2.x + this->x;temp.y = c2.y + y;return temp;
}Complex operator-(const Complex& c1, const Complex& c2) // 没有this指针,所以要把对象传进去
{Complex t;t.x = c1.x - c2.x;t.x = x + c2.x; // error,因为没有this指针t.y = c1.y - c2.y;return t;
}int main()
{Complex c1;Complex c2(1.1, -2.2);Complex c3(1.3, 4);cout << "\nc1="; c1.print;cout << "\nc2="; c2.print;cout << "\nc3="; c3.print;c1.add(c2); // c1 + c2cout << "\nafter add(), c1= "; c1.print;c1 += c2; // 运算符重载,和上面的实现功能一样,两个参数cout << "\nafter +=c2, c1= "; c1.print;c3 = c1 + c2; // 等号有缺省的运算符函数,加号没有,两个参数cout << "\nafter c3=c1+c2, c3= "; c3.print;c3 = c1 - c2; // 使用友元函数(c1 + c2 + c3); // 如果operator+(const Complex& c2)函数返回值为void的,则这一行代码错误return 0;
}// 除了感叹号的点,其余有点的运算符都不能做重载// "?:"运算符
int getmax(int x, int y)
{return (x > y) ? x : y;
}// "&="运算符
c3 = c1 & c2;
c1 &= c2;M1 = M1 * M2;
输入输出重载
#include <iostream>
using namespace std;class Complex
{
private:double x, y;public:Complex(double xx = 0, double yy = 0); // 如果不写参数,则默认他的xx和yy都默认为0,默认调用缺省构造函数friend ostream &operator<<(ostream &, const Complex &); // 重载<<,只能用友元函数,因为ostream不是Complex类型,所以不能用成员函数实现friend istream &operator>>(istream &, Complex &); // 重载>>
};Complex::Complex(double xx = 0, double yy = 0) // 如果不写参数,则默认他的xx和yy都默认为0
{x = xx;y = yy;
}ostream &operator<<(ostream &o, const Complex &c)
{o << c.x;if (c.y > 0){o << "+" << c.y << 'i';}if (c.y < 0){o << c.y << 'i';}return o;
}istream &operator>>(istream &, const Complex &)
{}int main()
{Complex c1;Complex c2(1.1, -2.2);Complex c3(1.3, 4);cout << c1 << c2;return 0;
}
期末
// 范围:类,对象和数组,继承,构造,析构,静态
// 虚继承,多态,多重继承,纯虚函数,运算符重载,深拷贝,虚函数// 纯虚函数,定义一个基类的指针,可以通过这个指针访问子类的函数,前提是父类的同样的函数前面加上virtual,纯虚函数是让父类的函数等于零
// 深拷贝,在类里面拷贝构造,运算符重载的等号
// 对象数组,类里面有一个数组的对象#include <iostream>
#include <cstring>
using namespace std;class A
{
private:char *name;int i;
public:// A() {cout << "constuct A";}// ~A() {cout << "destruct A";}A(const char*);~A();A(const A&); // 拷贝构造A& operator=(const A&); // 运算符重载void print() {cout << "this is class A\n";}// virtual void print() {cout << "this is class A\n";}// void print() = 0; // 纯虚函数不能有实例,可以有指针,它的子类必须实现这个函数
};A::A(const char* n)
{name = nullptr;size_t size = strlen(n);name = new char[size + 1];cout << "allocate memory for name\n";strncpy(name, n, size);cout << "construct A : " << name << endl;
}A::~A()
{cout << "destruct A : " << name << endl;delete[] name;
}A::A(const A& a)
{// 需要释放最开始构造申请的空间if (name != nullptr){delete[] name;}name = a.name; // 错误,此为浅拷贝size_t size = strlen(a.name); // 深拷贝,自己申请空间strncpy(name, a.name, size);
}class B : public A
{
public:void print() {cout << "this is class B\n";}
};class C : public A
{
public:void print() {cout << "this is class C\n";}
};class D : public A
{
public:
};int main()
{A *p, b[5];p = new A[5];cout << b[2].i;cout << (*(p + 2)).i;delete[] p;A a("OOP class"), *ap;A b("class 2");A b(a); // 调用拷贝构造函数A b = a; // 调用拷贝构造函数cout << "a.name=" << (void*)a.name << "b,name=" << (void*)b.name << endl; // 打印地址a = b; // 析构会出错cout << "a.name=" << (void*)a.name << "b,name=" << (void*)b.name << endl;// B b;// C c;// D d; // 错误,因为没有实现print函数a.print(); // 打印A的信息ap = &a;ap -> print(); // 打印A// ap = &b;ap -> print(); // 打印A,因为是静态联编,根据ap的类型调用其的类的函数,1// 动态联编,根据指向的数据类型调用其的函数// ap = &b;// ap -> print(); // 打印B return 0;
}
比较生日
#include <iostream>
using namespace std;struct CDate
{int y, m, d;
};class CPerson
{
private:CDate birthday;public:bool cmp(CDate c) // 比较谁的年龄更大{long l1, l2;l1 = birthday.y * 10000 + birthday.m * 100 + birthday.d;l2 = c.y * 10000 + c.m * 100 + c.d;return l1 > l2;}
};int main()
{CPerson p1, p2;return 0;
}
多重继承
#include <iostream>
using namespace std;class Person
{
protected:string name;Person(string n) {name = n;}
}class Student : virtual public Person // 虚继承
{
protected:int id;
public:// 如果提供了有参构造函数,系统不会提供缺省构造函数,如果没有提供有参构造函数,则系统会提供一个缺省的构造函数Student() : Person("") {} // 派生类必须调用父类的构造函数Student(string n, int i) : Person(n), id(i) {cout << "CS\n";} // 标准格式,派生类必须调用父类的构造函数~Student() {cout << "DS\n";}void print() {cout << name << id;}
};class Teacher : virtual public Person
{
protected:double salary;
public:Teacher(string, double) : Person(n){salary = s; cout << "CT\n";} // 不标准~Teacher() {cout << "DT\n";}void print() {cout << name << salary;}
};// 先执行Student的构造函数,再执行Teacher的构造函数,先析构Teacher再析构Student,顺序由此决定
class SJ : public Student, public Teacher // 记得加上public,否则默认private
{
public:SJ(string, int, double);~SJ() {cout << "Dsj\n";}void print();
};SJ::SJ(string n, int i, double s) // 要给父类提供参数,用标准格式初始化// 必须给祖先类实现构造函数: Person(n), Student(n, i), Teacher(n, s) // 如果不写Student(n, i),则会调用Student的无参构造函数
{cout << "Csj\n";
}void SJ::print()
{cout << name << id << name2 << salary;print1(); // 结果和上面相同print2();// 或者预操作Student::print();Teacher::print();cout << name << id << salary; // error,因为有两个类// 使用预操作cout << Teacher::name << id << salary; // 对cout << name << id << salary; // 对
}int main()
{// Student s;// Teacher t("zhang", 20000.0);SJ sj("li", 20230001, 4000.0);return 0;
}
相关文章:
C++期末整理
课堂笔记 构造与析构 #include <iosteam> #include <cstring> using namespace std;struct Date {int y, m, d;void setDate(int, int, int);Date(int yy, int mm, int dd) {y yy, m mm, d dd;} };class Student { private:char* name;Date birthday; public:…...
技术派Spring事件监听机制及原理
Spring事件监听机制是Spring框架中的一种重要技术,允许组件之间进行松耦合通信。通过使用事件监听机制,应用程序的各个组件可以在其他组件不直接引用的情况下,相互发送和接受消息。 需求 在技术派中有这样一个需求,当发布文章或…...
秋招突击——设计模式补充——简单工厂模式和策略模式
文章目录 引言正文简单工厂模式策略模式策略模式和工厂模式的结合策略模式解析 总结 引言 一个一个来吧,面试腾讯的时候,问了我单例模式相关的东西,自己这方面的东西,还没有看过。这里需要需要补充一下。但是设计模式有很多&…...
SwiftUI中List的liststyle样式及使用详解添加、移动、删除、自定义滑动
SwiftUI中的List可是个好东西,它用于显示可滚动列表的视图容器,类似于UITableView。在List中可以显示静态或动态的数据,并支持垂直滚动。List是一个数据驱动的视图,当数据发生变化时,列表会自动更新。针对List…...
PostgreSQL的系统视图pg_stats
PostgreSQL的系统视图pg_stats pg_stats 是 PostgreSQL 提供的一种系统视图,用于展示当前数据库中的统计信息。这些统计信息由数据库内部的自动统计过程通过 ANALYZE 命令收集,它们帮助查询规划器做出更好的执行决策,从而优化查询性能。 pg…...
UML2.0-系统架构师(二十四)
1、(重点)系统()在规定时间内和规定条件下能有效实现规定功能的能力。它不仅取决于规定的使用条件等因素,还与设计技术有关。 A可靠性 B可用性 C可测试性 D可理解性 解析: 可靠性:规定时间…...
leetcode 152. 乘积最大子数组「贪心」「动态规划」
152. 乘积最大子数组 题目描述: 给你一个整数数组nums,请你找出数组中乘积最大的非空连续子数组,并返回该子数组所对应的乘积 思路1:贪心 由于 n u m s [ i ] nums[i] nums[i]都是整数,所以多乘一些数肯定不会让绝…...
Android项目目录结构
Android项目目录结构 1. 顶层目录2. 重要的顶层文件和目录3. app模块目录结构4. 重要的**app**模块文件和目录5. 典型的 **build.gradle** 文件内容 典型的Android项目结构的详细介绍。 1. 顶层目录 MyAndroidApp/ ├── .gradle/ ├── .idea/ ├── app/ ├── build/ ├…...
网络安全--计算机网络安全概述
文章目录 网络信息系统安全的目标网络安全的分支举例P2DR模型信息安全模型访问控制的分类多级安全模型 网络信息系统安全的目标 保密性 保证用户信息的保密性,对于非公开的信息,用户无法访问并且无法进行非授权访问,举例子就是:防…...
用requirements.txt配置环境
1. 在anaconda创建环境 创建Python版本为3.8的环境,与yolov5所需的包适配。 2. 在Anaconda Prompt中激活环境 (base) C:\Users\吴伊晴>conda activate yolov5 3. 配置环境 用指定路径中的requirements.txt配置环境。 (yolov5) C:\Users\吴伊晴>pip insta…...
APP渗透-android12夜神模拟器+Burpsuite实现
一、夜神模拟器下载地址:https://www.yeshen.com/ 二、使用openssl转换证书格式 1、首先导出bp证书 2、将cacert.der证书在kali中转换 使用openssl生成pem格式证书,并授予最高权限 openssl x509 -inform der -in cacert.der -out cacert.pem chmod 777 cacert…...
源码扭蛋机开发初探
在软件开发的世界里,创新总是层出不穷。今天,我们将一起探讨一个有趣而富有创意的项目——源码扭蛋机。源码扭蛋机,顾名思义,就是将传统的扭蛋机概念与代码编程相结合,让开发者们在扭动的过程中随机获得各种有趣的、实…...
Patch SCN使用说明---惜分飞
软件说明 该软件是惜分飞(https://www.xifenfei.com)开发,仅用来查看和修改Oracle数据库SCN(System Change Number),主要使用在数据库因为某种原因导致无法正常启动的情况下使用该工具进行解决.特别是Oracle新版本中使用隐含参数,event,orad…...
【微服务架构的守护神】Eureka与服务熔断深度解析
标题:【微服务架构的守护神】Eureka与服务熔断深度解析 在微服务架构中,服务的数量众多,网络请求的复杂性也随之增加,这使得系统的稳定性面临挑战。服务熔断作为一种保护机制,能够在服务出现问题时及时切断请求&#…...
使用label-studio对OCR数据进行预标注
导读 label-studio作为一款数据标注工具相信大家都不陌生,对于需要进行web数据标注协同来说应该是必备工具了,标注的数据类型很全涉及AI的各个任务(图像、语音、NLP、视频等),还支持自定义涉及模版。 然而,我们在标注数据的过程…...
嵌入式linux sqlite3读写demo
以下是一个简单的C语言程序,使用SQLite数据库进行读写操作的示例。请确保您已经安装了SQLite3库。 #include <stdio.h> #include <stdlib.h> #include <sqlite3.h> static int callback(void *NotUsed, int argc, char **argv, char **azColNam…...
vue实现搜索文章关键字,滑到指定位置并且高亮
1、输入搜索条件,点击搜索按钮 2、滑到定位到指定的搜索条件。 <template><div><div class"search_form"><el-inputv-model"searchVal"placeholder"请输入关键字查询"clearablesize"small"style&quo…...
Stable Diffusion与AI艺术:探索人工智能的创造力
引言 随着人工智能(AI)技术的迅猛发展,AI艺术逐渐走进了公众视野。尤其是近年来,Stable Diffusion等技术的出现,显著提升了AI在艺术创作领域的表现力和创造力。这篇文章将深入探讨Stable Diffusion技术的工作原理、应…...
华为HCIP Datacom H12-821 卷26
1.单选题 在VRRP中,同一备份组的设备在进行VRRP报文认证时,以下哪一参数不会影响Master设备和Backup设备认证协商结果 A、认证字 B、优先级 C、认证方式 D、VRRP版本 正确答案: B 解析: 优先级只会影响谁是主谁是备&…...
golang 获取系统的主机 CPU 内存 磁盘等信息
golang 获取系统的主机 CPU 内存 磁盘等信息 要求 需要go1.18或更高版本 官方地址:https://github.com/shirou/gopsutil 使用 #下载包 go get github.com/shirou/gopsutil/v3/cpu go get github.com/shirou/gopsutil/v3/disk go get github.com/shirou/gopsuti…...
深度学习标量、向量、矩阵与张量(三)
1. 定位导航 线性代数是深度学习最核心的数学工具——没有之一。神经网络的前向传播本质上就是矩阵乘法加非线性激活;反向传播本质上就是链式法则在矩阵/向量上的应用;PCA、SVD、特征分解等工具贯穿从数据预处理到模型分析的全过程。 本篇是最基础的一篇…...
springboot框架健康饮食营养管理信息系统
目录需求分析与系统设计技术栈选型与环境搭建核心功能实现数据可视化与报告生成测试与部署项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作需求分析与系统设计 明确健康饮食营养管理系统的核心需求,包括用户注册登录…...
Qwen3-TTS-VoiceDesign实战案例:用‘撒娇稚嫩萝莉声’描述生成高拟真TTS音频
Qwen3-TTS-VoiceDesign实战案例:用‘撒娇稚嫩萝莉声’描述生成高拟真TTS音频 1. 项目概述与核心价值 Qwen3-TTS-VoiceDesign是一个让人惊艳的语音合成模型,它最大的特点就是能用简单的文字描述,生成你想要的任何声音风格。想象一下…...
从KITTI到TUM:利用evo工具链实现轨迹真值的格式转换与可视化分析
1. 理解KITTI与TUM轨迹格式的本质差异 第一次接触SLAM评估时,我被各种轨迹格式搞得头晕眼花。KITTI和TUM这两种最常见的格式,就像两个说着不同方言的技术专家。KITTI格式简单粗暴,直接记录12个数字代表相机的位姿变换矩阵(去掉最后…...
K230目标检测实战:手把手教你用Labelme标注数据并一键转成VOC格式(附避坑指南)
K230目标检测实战:高效数据标注与VOC格式转换全攻略 当你第一次接触K230开发板进行目标检测项目时,数据准备往往是最大的拦路虎。特别是从原始图片到符合AI_Cube要求的VOC格式数据集,这个过程充满了各种"坑"。本文将分享一套经过实…...
Wan2.2-I2V-A14B开源可部署:符合等保2.0要求,支持审计日志+访问控制
Wan2.2-I2V-A14B开源可部署:符合等保2.0要求,支持审计日志访问控制 1. 镜像概述与核心特性 Wan2.2-I2V-A14B是一款专为文生视频任务优化的私有部署镜像,基于RTX 4090D 24GB显存显卡和CUDA 12.4环境深度定制。本镜像不仅提供高性能的视频生成…...
OpCore-Simplify:实现OpenCore EFI自动化生成的黑苹果配置解决方案
OpCore-Simplify:实现OpenCore EFI自动化生成的黑苹果配置解决方案 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 副标题:告别…...
Phi-4-Reasoning-Vision惊艳案例:模糊图像增强后多步逻辑推理还原
Phi-4-Reasoning-Vision惊艳案例:模糊图像增强后多步逻辑推理还原 1. 项目概述 Phi-4-Reasoning-Vision是基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具,专为双卡4090环境优化。这款工具能够处理复杂的图像推理任务,…...
统信系统下如何管理Mysql?
背景 看到标题很多朋友会打趣的问我:“你不是一直用麒麟操作系统做讲解吗?”,其实DBCS和DESK的兼容性太强了,什么操作系统都行,Windows上最容易了,所以我一般不用Windows,下次我用Ubuntu给大家…...
Connect to Oracle Database with JDBC Driver
1. Overview The Oracle Database is one of the most popular relational databases. In this tutorial, we’ll learn how to connect to an Oracle Database using a JDBC Driver. 2. The Database To get us started, we need a database. If we don’t have access to …...
