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;
}

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

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

相关文章

视频号矩阵源码:构建短视频生态的基石

在数字化时代&#xff0c;视频内容已成为连接品牌与消费者的重要桥梁。视频号矩阵源码&#xff0c;作为短视频营销自动化的创新引擎&#xff0c;正在帮助内容创作者和营销团队以前所未有的效率和智能&#xff0c;管理和扩展他们的视频内容。本文将深入探讨视频号矩阵源码的核心…

RTL8211FSI PHY电路设计

文章目录 硬件设计引脚功能框图说明PHYADDRPageLED 模式自动协商/速度/全半双工模式Soft Reset上电顺序 原理图设计参考 软件控制&#xff08;FPGA&#xff09;硬件调试 硬件设计 引脚 笔者前代数字采集板采用的 PHY 芯片是博通 Boardcom 的 B50610&#xff0c;其仅支持 0 ∼…

leetcode 152. 乘积最大子数组「贪心」「动态规划」

152. 乘积最大子数组 题目描述&#xff1a; 给你一个整数数组nums&#xff0c;请你找出数组中乘积最大的非空连续子数组&#xff0c;并返回该子数组所对应的乘积 思路1&#xff1a;贪心 由于 n u m s [ i ] nums[i] nums[i]都是整数&#xff0c;所以多乘一些数肯定不会让绝…

Java 方法中循环调用具有事务的方法

在Java中&#xff0c;循环调用一个具有事务的方法时&#xff0c;需要特别注意事务的边界和管理。通常&#xff0c;事务的边界是由框架&#xff08;如Spring&#xff09;来控制的&#xff0c;确保方法执行时数据的完整性和一致性。然而&#xff0c;在循环中调用事务方法时&#…

RAG:本地部署Langchain-Ollma(Windows)

RAG&#xff1a;本地部署Langchain&#x1f99c;&#x1f517;-Ollma&#x1f42b;(Windows) RAG&#xff0c;即“Retrieval Augmented Generation”&#xff08;检索增强生成&#xff09;&#xff0c;是一种结合了检索和生成技术的自然语言处理模型。它主要用于文本生成任务&…

对SRS媒体服务器进行漏洞扫描时,SRS的API模块会出现漏洞,如何修补这些漏洞的简单方法

目录 一、引言 1、srs介绍 2、媒体流介绍 3、应用场景 二、SRS的http_api介绍、及漏洞 1、概述 2、http_api模块的作用 &#xff08;1&#xff09;提供HTTP API服务 &#xff08;2&#xff09;管理和监控SRS服务器 &#xff08;3&#xff09;自定义开发 三、漏洞扫描…

单位立方体各个面上的法向量,向量场以及每个面上的通量

单位立方体各个面上的法向量&#xff0c;向量场 F ( x , y , z ) \mathbf{F} (x, y, z) F(x,y,z) 以及每个面上的通量 flyfish 假设我们有一个单位立方体&#xff0c;向量场 F ( x , y , z ) \mathbf{F} (x, y, z) F(x,y,z) 在该立方体上。 法向量 &#xff1a;单位立方…

情绪识别反馈训练系统

系统应用简介 情绪识别检测训练系统可以通过语音、实时面部表情、静态情绪图片智能检测使用者的情绪&#xff0c;对异常情绪进行预警&#xff0c;以达到及时明晰情绪状态并辅助缓解负性情绪的目的。 应用范围&#xff1a;适用于年满足12周岁及以上人群。 二、系统基本原理 …

前端面试题14(贝塞尔曲线)

贝塞尔曲线在前端开发中经常用于创建平滑的动画路径或绘制复杂的矢量图形。贝塞尔曲线可以是一次、二次或三次的&#xff0c;其中三次贝塞尔曲线是最常见的&#xff0c;因为它提供了足够的灵活性来创建各种形状&#xff0c;同时保持计算上的可行性。 下面我将解释三次贝塞尔曲…

代码随想录算法训练营第五十九天 | 110.字符串接龙、105.有向图的完全可达性、106.岛屿的周长、复习

110.字符串接龙 题目链接&#xff1a;https://kamacoder.com/problempage.php?pid1183 文档讲解&#xff1a;https://programmercarl.com/kamacoder/0110.%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%8E%A5%E9%BE%99.html 思路 本题只需要求出最短路径的长度就可以了&#xff0c;不用找出…

使用 Qt 实现自定义拖动窗口

文章目录 如何在 Qt 中实现无标题栏窗口的拖动准备工作创建自定义窗口类使用 QDialog 实现拖动功能详细解释代码行解释 小结 如何在 Qt 中实现无标题栏窗口的拖动 在许多桌面应用程序中&#xff0c;我们经常需要自定义窗口外观&#xff0c;包括去掉标题栏&#xff0c;使窗口看…

SQL Server端口配置指南:最佳实践与技巧

1. 引言 SQL Server通常使用默认端口1433进行通信。为了提高安全性和性能&#xff0c;正确配置SQL Server的端口非常重要。本指南将帮助您了解如何配置和优化SQL Server的端口设置&#xff0c;以满足不同环境和需求。 2. 端口配置基础 2.1 默认端口 SQL Server的默认端口是…

LabVIEW幅频特性测试系统

使用LabVIEW软件开发的幅频特性测试系统。该系统整合了Agilent 83732B信号源与Agilent 8563EC频谱仪&#xff0c;通过LabVIEW编程实现自动控制和数据处理&#xff0c;提供了成本效益高、操作简便的解决方案&#xff0c;有效替代了昂贵的专用仪器&#xff0c;提高了测试效率和设…

一款EF Core下高性能、轻量级针对分表分库读写分离的解决方案

ShardingCore项目介绍 ShardingCore是一款开源、简单易用、高性能、普适性&#xff0c;针对EF Core生态下的分表分库的扩展解决方案&#xff0c;支持EF Core2的所有版本&#xff0c;支持EF Core2的所有数据库、支持自定义路由、动态路由、高性能分页、读写分离的一款EF Core拓展…

华为云生态和快速入门

华为云生态 新技术催生新物种&#xff0c;新物种推动新生态 数字技术催生各类运营商去重塑并颠覆各行业的商业模式 从业务层面看&#xff0c;企业始终如一的目标是业务增长和持续盈利&#xff0c;围绕这些目标衍生出提质、增效、降本、安全、创新和合规的业务诉求&#xff0c…

本迪戈和阿德莱德银行与MongoDB合作, 利用生成式AI对银行核心技术进行现代化改造

MongoDB公司&#xff08;纳斯达克股票代码&#xff1a;MDB&#xff09;近日宣布与本迪戈和阿德莱德银行 (Bendigo and Adelaide Bank&#xff0c;澳大利亚证券交易所股票代码&#xff1a;BEN&#xff09;建立合作伙伴关系。 本迪戈和阿德莱德银行将使用MongoDB Atlas对其银行核…

【PTGui、Pano2VR6、UE4】VR全景拍摄及漫游交互制作操作实例(更新中)

一、基本思路 首先进行VR全景拍摄&#xff0c;获取高质量的全景图像&#xff1b;然后使用PTGui进行图像拼接&#xff0c;确保图像的连续性与准确性&#xff1b;接着利用Pano2VR6进行VR漫游的制作&#xff0c;添加交互元素与多媒体内容&#xff1b;最后进行作品的调试与优化&am…

条件筛选1-4题(30 天 Pandas 挑战)

条件筛选 1. 相关知识点1.1 query条件或查询1.2 query条件与查询1.3 存在查询及列名修改1.4 条件查询&#xff0c;相等1.5 删除重复值1.6 排序 2. 题目2.1 大的国家2.2 可回收且低脂的产品2.3 从不订购的客户2.4 文章浏览 I 1. 相关知识点 1.1 query条件或查询 # |或 world.q…

三星组件新的HBM开发团队加速HBM研发

为应对人工智能(AI)市场扩张带来的对高性能存储解决方案需求的增长&#xff0c;三星电子在其设备解决方案(DS)部门内部成立了全新的“HBM开发团队”&#xff0c;旨在提升其在高带宽存储器(HBM)领域的竞争力。根据Business Korea的最新报告&#xff0c;该团队将专注于推进HBM3、…

CUDA编程基础

文章目录 1、GPU介绍2、CUDA程序进行编译3、CUDA线程模型3.1、一维网格一维线程块3.2、二维网格二维线程块3.3、三维网格三维线程块3.3、不同组合形式 4、nvcc编译流程5、CUDA程序基本架构6、错误检测函数6.1、运行时API错误代码6.2、检查核函数 7、CUDA记时7.1、记时代码7.2、…