c++中的常用知识点总结
命名空间
使用命名空间之后,调用代码时可以省去也可以不省去相关的前缀。
#include <iostream>using namespace std;//使用c++自己的命名空间
int main() {int num1 = 10;std::cout << "Hello, World!" << std::endl;cout<<num1<<endl;return 0;
}
自定义命名空间
// 命名空间#include <iostream>// 声明std,我们的main函数就可以直接使用里面的成员,不需要使用 std::
using namespace std; // C++自己的命名空间 (C# .net 命名空间)// 自定义命名空间
namespace derry1 {int age = 33;char * name = "Derry猛男1";void show() {cout << "name:" << name << ", age:" << age << endl;}void action() {cout << "derry1 action" << endl;}
}// TODO ------ 命名空间里面重复的函数
// 自定义命名空间
namespace derry2 {void action() {cout << "derry2 action" << endl;}
}// TODO ------ 小概率会遇到的情况,命名空间的嵌套
// 自定义命名空间
namespace derry3 {namespace derry3Inner {namespace derry3Inner1 {namespace derry3Inner2 {namespace derry3Inner3 {void out() {cout << "爱恨情仇人消瘦,悲欢起落人寂寞" << endl;}}}}}
}// 声明各个写的 命名空间
// using namespace derry1;int main() {cout << "命名空间" << endl;// 声明各个写的 命名空间using namespace derry1;int ageValue = derry1::age; // 方式1 使用 刚刚声明的命名空间derry1::show(); // 使用 刚刚声明的命名空间ageValue = age; // 方式2 直接去引出来 ::show(); // 直接去引出来 ::// TODO ------ 命名空间里面重复的函数using namespace derry2;// action(); 很尴尬derry1::action();derry2::action();// TODO ------ 小概率会遇到的情况,命名空间的嵌套// 第一种方式 先声明命名空间 再使用using namespace derry3::derry3Inner::derry3Inner1::derry3Inner2::derry3Inner3;// 再使用out();// 第二种方式 直接使用derry3::derry3Inner::derry3Inner1::derry3Inner2::derry3Inner3::out();return 0;
}
类
- 头文件:Student.h
//
// Created by sunteng on 2023/9/5.
//#ifndef TEST_STUDENT_H
#define TEST_STUDENT_H#endif //TEST_STUDENT_Hclass Student{private://下面的成员和函数,都是私有char * name;int age;public://下面的成员和函数,都是公有void setAge(int age);void setName(char *name);int getAge();char * getName();};
- 类文件:Student.cpp
//
// Created by sunteng on 2023/9/5.
//#include "Student.h"// 根据 Student.h 头文件 ,写实现// 和实现头文件那个函数,没有任何关系,相当于另外一个函数
/*void setAge(int age) {}*/void Student::setAge(int age) {//this是一个Student类型的指针this->age = age;
}void Student::setName(char *name) {this->name = name;
}int Student::getAge() {return this->age;
}char * Student::getName() {return this->name;
}
- main
#include <iostream>
#include "Student.h"//引入头文件即可
using namespace std;
int main() {Student student1;//栈区开辟空间//赋值student1.setName("brett");student1.setAge(19);cout<<"name:"<<student1.getName()<<" ,age:"<<student1.getAge()<<endl;Student* student2 = new Student();//new 堆区分配空间student2->setAge(88);student2->setName("mike");cout<<"name:"<<student2->getName()<<" ,age:"<<student2->getAge()<<endl;//堆区分配的对象使用完之后必须手动释放if(student2){delete student2;student2 = NULL;}// new/delete 是一套 会调用构造函数 与 析构函数 【C++标准规范】// malloc/free是一套 不调用构造函数 与 析构函数 【C的范畴,虽然不推荐,但是也是可以的】return 0;
}
- 构造函数和析构函数
#include <iostream>
#include <string.h>
using namespace std;class Student {// 构造函数
public:// 空参数构造函数Student() {cout << "空参数构造函数" << endl;}// 一个参数的构造函数// :Student(name, 87) 等价 1.调用两个参数的构造函数, 2.再调用当前函数// 学生说的:先调用两个参数的,再调用一个的Student(char *name) :Student(name, 87) {cout << "一个参数的构造函数" << endl;if(!this->name){//防止重复赋值this->name = name;}}// 两个参数的构造函数Student(char *name, int age) {// this->name = name;// 堆区this->name = (char *) (malloc(sizeof(char *) * 10));strcpy(this->name, name);this->age = age;cout << "两个参数的构造函数" << endl;}// 析构函数 Student对象的,临终遗言,Student对象被回收了,你做一些释放工作// delete stu 的时候,我们的析构函数一定执行// free不会执行析构函数,也意味着,你没法在析构函数里面,做释放工作, malloc也不会调用构造函数~Student() {cout << "析构函数" << endl;// 必须释放 堆区开辟的成员if (this->name) {free(this->name);this->name = NULL; // 执行NULL的地址,避免出现悬空指针}}// 私有属性
private:char *name;int age;// 公开的 set get 函数
public:int getAge() {return this->age;}char *getName() {return this->name;}void setAge(int age) {this->age = age;}void setName(char *name) {this->name = name;}
};int main() {// TODO =========== 下面是堆区 开辟空间的 堆区必须手动释放,否则内存占用越来// 系统源码中,会看到,很多使用 new 关键字// *stu ->:调用一级指针的成员// new/delete// C++中,必须使用 new/delete 一套Student *stu = new Student("杜子腾");cout << "name:" << stu->getName() << ", age:" << stu->getAge() << endl;delete stu;return 0;
}
- 拷贝构造函数与构造函数
// 4.拷贝构造函数。#include <iostream>
#include <string.h>using namespace std;class Student {public:Student() { cout << "空参数构造函数" << endl; }// 两个参数的构造函数Student(char *name, int age) : name(name), age(age) {cout << "两个参数构造函数" << endl;}// 析构函数// ~Student(char * name) { } 这样写,就不是析构函数了,如果你这样写,C/C++编译器对你很无语~Student() {cout << "析构函数" << endl;}// 拷贝构造函数,它默认有,我们看不到,一旦我们写拷贝构造函数,会覆盖她// 对象1 = 对象2// 覆盖拷贝构造函数Student(const Student & student) { // 常量引用:只读的,不让你修改cout << "拷贝构造函数" << endl;// 我们自己赋值// 为什么要自己赋值,自己来控制,就可以 例如:-10this->name = student.name;this->age = student.age - 10;cout << "自定义拷贝构造函数 内存地址 " << &student << endl;}// 私有属性
private:char *name;int age;// 公开的 set get 函数
public:int getAge() {return this->age;}char *getName() {return this->name;}void setAge(int age) {this->age = age;}void setName(char *name) {this->name = name;}
};struct Person {int age;char *name;
};// TODO = 号的意义 隐士代码,引出 拷贝构造函数int main() {Person person1 = {100, "张三丰"};// = 你看起来,没有什么特殊,隐士的代码:你看不到 C/C++编译器 会把p1的成员值赋值给p2成员Person person2 = person1;cout << &person1 << endl;cout << &person2 << endl;cout << person2.name << ", " << person2.age << endl;// 思考:对象 对象1=对象2 默认的 拷贝构造函数return 0;
}// TODO 拷贝构造函数/*int main() {Student stu1("李鬼", 34);Student stu2 = stu1;cout << stu2.getName() << " , " << stu2.getAge() << endl;cout << "main " << &stu1 << endl; // 地址的打印是一样的, 注意:cnetos的环境 地址打印有差异,要注意// TODO 拷贝构造函数的注意点:// Student stu1("李鬼", 34);// Student stu2;// stu2 = stu1; // 这样赋值是不会调用 自定义拷贝构造函数,但是会调用默认赋值// Student stu2 = stu1; // 这样赋值是会调用 自定义拷贝构造函数,我们自己赋值// cout << stu2.getName() << " , " << stu2.getAge() << endl;getchar(); // 程序等待在这一行return 0;
} // main函数弹,stu1栈成员会回收 stu2栈成员会回收
*/// TODO 这种写法 拷贝构造函数 到底会不会调用
/*int main() {Student *student1 = new Student("杜子腾", 39);Student *student2 = student1; // 压根就不会执行拷贝构造函数(指针指向问题,和我们刚刚那个 对象2=对象1 是两回事)student2->setAge(99);cout << student1->getName() << student1->getAge() << endl;return 0;
}*/
- 深拷贝与浅拷贝
#define _CRT_SECURE_NO_WARNINGS // strcpy运行会报错,支持#include<iostream>
#include<string.h>
using namespace std;class Student
{
public:int age;char * name;Student() { cout << "空参数构造函数" << endl; }Student(char * name) :Student(name, 99) {cout << "一个参数构造函数 this:" << this << endl;}Student(char * name, int age) {cout << "二个参数构造函数 this:" << this << endl;this->name = (char *)malloc(sizeof(char *)* 10);strcpy(this->name, name);this->age = age;}~Student() {cout << "析构函数执行 &this->name:" << this->name << endl;free(this->name);this->name = NULL;}// 默认有一个拷贝构造函数 隐士的 我们看不见// 一旦复写了拷贝构造函数,默认的还在吗? Java的构造函数一个思路// 自定义拷贝构造函数 如果有堆成员,必须采用深拷贝Student(const Student & stu) {// stu 旧地址// this 新地址// s2 = 新地址cout << "拷贝构造函数 &stu:" << &stu << " this:" << this << endl;//二者地址不一样// 【浅拷贝】:新地址name 旧地址name 指向同一个空间,会造成,重复free的问题,引发奔溃// 新地址name = 旧地址 (浅拷贝)// this->name = stu.name;// 【深拷贝】this->name = (char *)malloc(sizeof(char *)* 10);strcpy(this->name, name);this->age = stu.age;cout << "拷贝构造函数2 this->name:" << (this->name) << " stu.name:" << stu.name << endl;// 深拷贝 后面见 原理全部打通的时候讲} // 此拷贝构造函数执行完 旧会出现一个 this==新地址 给 main函数的 stu// 默认的拷贝构造函数 是浅拷贝
};void showStudent(Student stu) {cout << "showStudent函数:" << &stu << " " << stu.name << "," << stu.age<< endl;
}int main() {Student stu("刘奋", 31);showStudent(stu); // 弹栈后 新地址name释放一遍showStudent(stu);
//
// showStudent(stu);
//
//
// showStudent(stu);
//
//
// showStudent(stu);getchar();return 0;
} // main函数弹栈 stu 旧地址
指针常量 常量指针 常量指针常量
// 指针常量 常量指针 常量指针常量#include <iostream>
#include <string.h>
#include <string.h>using namespace std;int main() {// *strcpy (char *__restrict, const char *__restrict);// strcpy()int number = 9;int number2 = 8;// 大道至简 一分钟搞定// 常量指针const int * numberP1 = &number;// *numberP1 = 100; // 报错,不允许去修改【常量指针】存放地址所对应的值// numberP1 = &number2; // OK,允许重新指向【常量指针】存放的地址// 指针常量int* const numberP2 = &number;*numberP2 = 100; // OK,允许去修改【指针常量】存放地址所对应的值// numberP2 = &number2; // 报错,不允许重新指向【指针常量】存放的地址// 常量指针常量const int * const numberP3 = &number;// *numberP3 = 100; // 报错,不允许去修改【常量指针常量】存放地址所对应的值// numberP3 = &number2; // 报错,不允许重新指向【常量指针常量】存放的地址return 0;
}
运算符重载
// 2.类里运算符重载。#include <iostream>
using namespace std;class Derry {
private:int x,y;public:Derry() {}// 系统C++源码,大量使用此方式 :x(x), y(y)Derry(int x, int y) :x(x), y(y) {}// set get 函数void setX(int x) {this->x = x;}void setY(int y) {this->y = y;}int getX() {// this->x -9; 系统怕你在函数里面 修改了return this->x;}int getY() {return this->y;}// +号,运算符重载/*Derry operator + (Derry derry1) {// this指针 指向当前对象,所以只需要一个int x = this->x + derry1.getX();int y = this->y + derry1.getY();return Derry(x, y);}*/// 系统是这样写的 常量引用:不允许修改,只读模式// const 关键字的解释// & 性能的提高,如果没有& 运行+ 构建新的副本,会浪费性能// 如果增加了& 引用是给这块内存空间取一个别名而已Derry operator + (const Derry& derry1) {// this指针 指向当前对象,所以只需要一个int x = this->x + derry1.x; // 我在类的里面,是可以拿私有成员的int y = this->y + derry1.y; // 我在类的里面,是可以拿私有成员的return Derry(x, y);}// 运算符- 重载Derry operator - (const Derry & derry1) {int x = this->x - derry1.x;int y = this->y - derry1.y;return Derry(x, y);}
};int main() {Derry derry1(1000, 2000);Derry derry2(3000, 4000);// Derry result = derry1 + derry2;Derry result = derry2 - derry1;cout << result.getX() << " , " << result.getY() << endl;return 0;
}
二义性与虚基类
// 多继承 二义性2:
// 在真实开发过程中,严格避免出现 二义性#include <iostream>using namespace std;// 祖父类
class Object {
public:int number;
};// 父类1
class BaseActivity1 : public Object {};// 父类2
class BaseActivity2 : public Object {};// 子类
class Son : public BaseActivity1, public BaseActivity2 {// 第二种解决方案: 在类中定义同名成员,覆盖掉父类的相关成员
public:int number;};int main() {Son son;// error: request for member 'show' is ambiguous 二义性 歧义// son.number = 2000;// 第一种解决方案: :: 明确指定son.BaseActivity1::number = 1000;son.BaseActivity2::number = 1000;// 第二种解决方案: 在类中定义同名成员,覆盖掉父类的相关成员son.number = 3000;// 第三种解决方案: 【虚基类】 属于 虚继承的范畴return 0;
}//第三种方式;虚基类// 第三种解决方案: 【虚基类】 属于 虚继承的范畴
// 真实C++开始,是很少出现,二义性(歧义) 如果出现, 系统源码(系统用 第三种解决方案)#include <iostream>using namespace std;// 祖父类
class Object{
public:int number;void show() {cout << "Object show run..." << endl;}
};// 父类1
class BaseActivity1 : virtual public Object {
};// 父类2
class BaseActivity2 : virtual public Object {
};// 子类
class Son : public BaseActivity1, public BaseActivity2 {};int main() {Object object;BaseActivity1 baseActivity1;BaseActivity2 baseActivity2;Son son;object.number = 100;baseActivity1.number = 200;baseActivity2.number = 300;son.number = 400;object.show();baseActivity1.show();baseActivity2.show();son.show();cout << object.number << endl;cout << baseActivity1.number << endl;cout << baseActivity2.number << endl;cout << son.number << endl;return 0;
}
- 虚基类
在C++中,虚基类是用于解决多继承中的菱形继承问题的一种机制。菱形继承指的是一个派生类同时继承自两个或多个基类,而这些基类又共同继承自同一个基类,形成了一个菱形的继承结构。
虚基类的作用是解决菱形继承带来的二义性和冗余的问题。当一个派生类通过多条路径继承自同一个基类时,如果不使用虚基类,那么在派生类中就会存在多个基类子对象的实例,这样就会导致同名成员在派生类中出现冗余,访问这些成员时会产生二义性。
通过使用虚基类,可以确保在派生类中只有一个基类子对象的实例,从而避免了冗余和二义性。虚基类的成员在派生类中只有一份拷贝,这样就可以确保派生类对基类成员的访问是唯一的。
使用虚基类的语法是在派生类的基类列表中,将虚基类声明为虚基类。例如:
class Base {
public:// Base类的成员
};class Derived1 : virtual public Base {
public:// Derived1类的成员
};class Derived2 : virtual public Base {
public:// Derived2类的成员
};class Derived3 : public Derived1, public Derived2 {
public:// Derived3类的成员
};
在上面的例子中,Base是虚基类,Derived1和Derived2都通过虚继承方式继承自Base。Derived3通过多继承同时继承自Derived1和Derived2,这样就避免了菱形继承带来的问题。
总结来说,虚基类的作用是解决多继承中的菱形继承问题,避免冗余和二义性,确保派生类对基类成员的访问是唯一的。
公有继承与私有继承
#include <iostream>using namespace std;class Person {
public:char *name;int age;public:Person(char *name, int age) : name(name) {this->age = age;cout << "Person 构造函数" << endl;}void print() {cout << this->name << " , " << this->age << endl;}
};// 1.默认是 隐式代码: : private Person
// 2.私有继承:在子类里面是可以访问父类的成员,但是在类的外面不行
// 3.必须公开继承,才可以访问父类的成员
class Student : public Person {// 类 默认是私有,注意下private:char * course;public:// :父类 , 给自己子类成员初始化Student(char * name, int age, char* course) : Person(name, age) , course(course) {cout << "Student 构造函数" << endl;}void test() {cout << name << endl;cout << age << endl;print();}
};int main() {Student stu("李元霸", 99, "C++");// 公开继承,才可以拿父类的成员stu.name = "李四";return 0;
}
静态类
// 2.C++static关键字。 正确的写法/*** 静态的总结:* 1.可以直接通过类名::静态成员(字段/函数)* 2.静态的属性必须要初始化,然后再实现(规则)* 3.静态的函数只能取操作静态的属性和方法*/#include <iostream>using namespace std;class Dog {
public:char * info;int age;// 先声明static int id;static void update() {id += 100;// 报错:静态函数不能调用非静态函数// update2();}void update2() {id = 13;}
};// 再实现
int Dog::id = 9;int main() {Dog dog;dog.update2(); // 普通函数Dog::update(); // 静态函数dog.update(); // 对象名.静态函数(一般都是使用::调用静态成员,这种方式可以 知道就行)cout << Dog::id << endl;return 0;
}
友元类和友元函数
在C++中,友元类和友元函数是一种特殊的访问权限控制机制,允许一个类或函数访问另一个类的私有成员。
友元类(Friend Class)是指在一个类中声明另一个类为友元,从而使得被声明的类可以访问声明它为友元的类的私有成员。友元类的声明通常出现在类的定义中,例如:
class A {friend class B; // B是A的友元类
private:int privateData;
};class B {
public:void accessPrivateData(A& obj) {int data = obj.privateData; // 可以访问A类的私有成员}
};
在上面的例子中,类B被声明为类A的友元类,因此类B可以访问类A的私有成员privateData。
友元函数(Friend Function)是指在一个类中声明一个函数为友元,从而使得被声明的函数可以访问声明它为友元的类的私有成员。友元函数的声明通常出现在类的定义中,例如:
class A {friend void printPrivateData(A& obj); // printPrivateData是A的友元函数
private:int privateData;
};void printPrivateData(A& obj) {int data = obj.privateData; // 可以访问A类的私有成员
}
在上面的例子中,函数printPrivateData被声明为类A的友元函数,因此函数printPrivateData可以访问类A的私有成员privateData。
需要注意的是,友元类和友元函数破坏了封装性,因此应该谨慎使用。过度使用友元可能会导致代码的可维护性和可读性下降。在设计类的时候,应该优先考虑使用成员函数和访问修饰符(如public、private、protected)来实现对类成员的访问控制。只有在确实需要访问私有成员的特殊情况下,才考虑使用友元类或友元函数。
// 友元函数// 老外:你是它的好朋友,那就可以拿私有成员给好朋友#include <iostream>using namespace std;class Person {
private: // 私有的age,外界不能访问int age = 0;public:Person(int age) {this->age = age;}int getAge() {return this->age;}// 定义友元函数 (声明,没有实现)friend void updateAge(Person * person, int age);
};// 友元函数的实现,可以访问所以私有成员
void updateAge(Person* person, int age) {// 默认情况下:不能修改 私有的age// 谁有这个权限:友元(拿到所有私有成员)person->age = age;
}int main() {Person person = Person(9);updateAge(&person, 88);cout << person.getAge() << endl;return 0;
}
可变参数
#include <iostream>
#include <stdarg.h> // 可变参数的支持
using namespace std;// Java的可变参数: int ...
// C++的可变参数写法:...// count变量的第二个用处,用于循环遍历长度
void sum(int count, ...) {va_list vp; // 可变参数的动作// 参数一:可变参数开始的动作vp// 参数二:内部需要一个 存储地址用的参考值,如果没有第二个参数,内部他无法处理存放参数信息va_start(vp, count);// 到这里后:vp就已经有丰富的信息for (int i = 0; i < count; ++i) {int r = va_arg(vp, int);cout << r << endl;}// 越界 系统值 乱码// 取出可变参数的一个值 【娶不到后,会取系统值 乱码】
// int number = va_arg(vp, int);
// cout << number << endl;// 关闭阶段(规范:例如:file文件一样 要关闭)va_end(vp);
}// 1.可变参数
int main() {sum(3, 6,7,8); // 真实开发过程的写法return 0;
}
this是什么——指针常量
class Worker {
public:char * name;int age = NULL; // C++中不像Java,Java有默认值, 如果你不给默认值,那么就是系统值 -64664// int * const 指针常量 指针常量【地址对应的值能改,地址不可以修改】// const int * 常量指针 常量指针【地址可以修改,地址对应的值不能改】// 纠结:原理:为什么可以修改age// 默认持有隐士的this【类型 * const this】// 类型 * const 指针常量:代表指针地址不能被修改,但是指针地址的值是可以修改的void change1() {// 代表指针地址不能被修改// this = 0x6546; // 编译不通过,地址不能被修改,因为是指针常量// 地址不可以修改// this = 0x43563;// 隐士的this// 但是指针地址的值是可以修改的// 地址对应的值能改this->age = 100;this->name = "JJJ";}// 默认现在:this 等价于 const Student * const 常量指针常量(地址不能改,地址对应的值不能改)void changeAction() const {// 地址不能改// this = 0x43563;// 地址对应的值不能改// this->age = 100;}// 原理:修改隐士代码 const 类型 * const 常量指针常量void showInfo() const {// this->name = "";// this->age = 88;// 只读的cout << "age:" << age << endl;}
};
多线程
C++ 11 之后添加了新的标准线程库 std::thread,std::thread 在 头文件中声明,因此使用 std::thread 时需要包含 在 头文件。
// 演示多线程的CPP程序
// 使用三个不同的可调用对象
#include <iostream>
#include <thread>
using namespace std;// 一个虚拟函数
void foo(int Z)
{for (int i = 0; i < Z; i++) {cout << "线程使用函数指针作为可调用参数\n";}
}// 可调用对象
class thread_obj {
public:void operator()(int x){for (int i = 0; i < x; i++)cout << "线程使用函数对象作为可调用参数\n";}
};int main()
{cout << "线程 1 、2 、3 ""独立运行" << endl;// 函数指针thread th1(foo, 3);//不需要显式调用start()方法来启动线程,std::thread对象的构造函数会自动启动线程的执行。// 函数对象thread th2(thread_obj(), 3);// 定义 Lambda 表达式auto f = [](int x) {for (int i = 0; i < x; i++)cout << "线程使用 lambda 表达式作为可调用参数\n";};// 线程通过使用 lambda 表达式作为可调用的参数thread th3(f, 3);// 等待线程完成// 等待线程 t1 完成th1.join();// 等待线程 t2 完成th2.join();// 等待线程 t3 完成th3.join();return 0;
}/*
线程 1 、2 、3 独立运行
线程使用函数指针作为可调用参数
线程使用函数指针作为可调用参数
线程使用函数指针作为可调用参数
线程使用函数对象作为可调用参数
线程使用函数对象作为可调用参数
线程使用函数对象作为可调用参数
线程使用 lambda 表达式作为可调用参数
线程使用 lambda 表达式作为可调用参数
线程使用 lambda 表达式作为可调用参数
*/
相关文章:
c++中的常用知识点总结
命名空间 使用命名空间之后,调用代码时可以省去也可以不省去相关的前缀。 #include <iostream>using namespace std;//使用c自己的命名空间 int main() {int num1 10;std::cout << "Hello, World!" << std::endl;cout<<num1&l…...

Leetcode:349. 两个数组的交集【题解超详细】
题目 给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 难度:简单 题目链接:349.两个数组的交集 示例 1: 输入:nums1 [1,2,2,1], nums2 [2,…...

Java 【异常】
一、认识异常 Exception 在 Java 中,将程序执行过程中发生的不正常行为称为异常 。 异常是异常exception,报错是报错error 1.算数异常 0不能作为除数,所以算数异常 2.空指针异常 arr不指向任何对象,打印不出arr的长度,…...
B - Polycarp‘s Practice
Polycarp is practicing his problem solving skill. He has a list of nn problems with difficulties a_1, a_2, \dots, a_na1,a2,…,an, respectively. His plan is to practice for exactly kk days. Each day he has to solve at least one problem from his list. …...
朴素贝叶斯数据分类------
------------------后期会编辑些关于朴素贝叶斯算法的推导及代码分析----------------- import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB, BernoulliNB, MultinomialNB from sklear…...

flask中的操作数据库的插件Flask-SQLAlchemy
1、ORM 框架 Web 开发中,一个重要的组成部分便是数据库了。Web 程序中最常用的莫过于关系型数据库了,也称 SQL 数据库。另外,文档数据库(如 mongodb)、键值对数据库(如 redis)近几年也逐渐在 w…...
arrow的使用
pandas2.0引入了pyarrow作为可选后端,比numpy的性能提高很多,所以为了改造backtrader,用cython和c++重写整个框架,准备用arrow作为底层的数据结构(backtrader现在的底层数据结构是基于python array构建的) 安装arrow推荐使用vcpkg git clone https://github.com/Microsoft…...
【24种设计模式】装饰器模式(Decorator Pattern(Wrapper))
装饰器模式 装饰器模式是一种结构型设计模式,用于动态地给对象添加额外的行为或责任,而不需要改变原始对象的结构。通过创建一个包装器类(装饰器),它包含原始对象的引用,并提供与原始对象相同的接口&#…...
小程序v-for与key值使用
小程序中的v-for和key与Vue中的用法基本相同。v-for用于循环渲染列表,key用于给每个循环项分配一个唯一的标识。 使用v-for时,通常建议使用wx:for代替,例如: <view wx:for"{{ items }}" wx:key"id">{…...

Qt包含文件不存在问题解决 QNetworkAccessManager
这里用到了Qt的网络模块,在.pro中添加了 QT network 但是添加 #include <QNetworkAccessManager> 会报错说找不到,可以通过在项目上右键执行qmake后,直接#include <QNetworkAccessManager>就不会报错了:...

【视频图像篇】FastStone Capture屏幕长截图软件
【视频图像篇】FastStone Capture屏幕长截图软件 FastStone Capture最常用的一款屏幕长截图软件—【蘇小沐】 文章目录 【视频图像篇】FastStone Capture屏幕长截图软件实验环境1、启动界面2、自定义工具栏3、自动保存 (一)长截图1、捕获滚动窗口2、捕获…...

【C语言】每日一题(杨氏矩阵查找数)
目录 杨氏矩阵介绍:方法:思路:代码实现: 杨氏矩阵介绍: 既然在杨氏矩阵中查找数,那什么是杨氏矩阵呢? 矩阵的每行从左到右是递增的,矩阵从上到下是递增的。 例如: 方法…...

探究SpringWeb对于请求的处理过程
探究目的 在路径归一化被提出后,越来越多的未授权漏洞被爆出,而这些未授权多半跟spring自身对路由分发的处理机制有关。今天就来探究一下到底spring处理了什么导致了才导致鉴权被绕过这样严重的问题。 DispatcherServlet介绍 首先在分析spring对请求处…...

如何使用Google Compute Engine入门指南快速创建和配置您的云虚拟机实例
文章目录 步骤1:创建 Google Cloud Platform(GCP)账户步骤2:设置 GCP 项目步骤3:启用 Google Compute Engine API步骤4:安装 Google Cloud SDK步骤5:创建虚拟机实例步骤6:连接到虚拟…...
springMVC中全局异常处理
前言: 当不同方法执行时,抛出相同异常。为了简约代码和避免重复使用try{}catch{}。此时使用统一异常处理。但局部的统一异常处理只能为所在类所调用。因此产生全局异常处理,该类中统一异常处理方法可以作用于整个controller。(以…...

【Nginx24】Nginx学习:压缩模块Gzip
Nginx学习:压缩模块Gzip 又是一个非常常见的模块,Gzip 现在也是事实上的 Web 应用压缩标准了。随便打开一个网站,在请求的响应头中都会看到 Content-Encoding: gzip 这样的内容,这就表明当前这个请求的页面或资源使用了 Gzip 压缩…...
我的私人笔记(zookeeper分布式安装)
分布式安装 1.安装前准备 (1)下载zookeeper:Index of /dist/zookeeper(当前使用为3.4.10版本) (2)安装JDK (3)拷贝zookeeper安装包到Linux系统下 (4)解压到指定目录 tar -xzvf zookeeper-3.4.10.tar.gz -C /opt/servers/ (5)修改名称 …...

小程序排名优化全攻略
随着小程序的快速发展,小程序之间的竞争也日益激烈。如何在竞争对手众多的环境下脱颖而出,通过小程序排名优化来提高曝光率和流量转化率,已成为许多小程序开发者和运营者关注的重点。本文将全面解析小程序排名优化的方法,让您可以更好地提升小程序的搜索排名。 【名即微】 小程…...
MySQL MHA
什么是 MHA MHA(Master High Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件 MHA 的出现就是解决MySQL 单点故障的问题 MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作 MHA能在故障切换的过程中最大程度上…...
Java API速记手册(持续更新ing...)
诸神缄默不语-个人CSDN博文目录 之所以干这个事原因也很简单,因为我3年没写Java了,现在在复健。 因为我最近都在用Python,所以跟Python一样的部分我就不写了。 最基本的框架public class MainClass {public static void main(String[] args…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...