面试问题总结:qt工程师/c++工程师

C 语言相关问题答案

面试问题总结:qt工程师/c++工程师

      • C 语言相关问题答案
  • 目录
        • 基础语法与特性
        • 内存管理
        • 预处理与编译
      • C++ 相关问题答案
        • 面向对象编程
        • 模板与泛型编程
        • STL 标准模板库
      • Qt 相关问题答案
        • Qt 基础与信号槽机制
        • Qt 界面设计与布局管理
        • Qt 多线程与并发编程

目录

在这里插入图片描述

基础语法与特性
  • static 关键字的作用
    • 全局变量:用 static 修饰全局变量,会使该变量的作用域仅限于定义它的文件内,其他文件无法通过 extern 声明来使用。例如,在 file1.c 中定义 static int global_static_var = 10;,在 file2.c 中无法使用这个变量。
    • 局部变量static 修饰局部变量时,该变量只会在第一次进入其所在函数时初始化,之后再次调用该函数,变量会保留上次调用结束时的值。例如:
#include <stdio.h>void func() {static int local_static_var = 0;local_static_var++;printf("%d\n", local_static_var);
}int main() {func(); // 输出 1func(); // 输出 2return 0;
}
- **函数**:`static` 修饰函数,会使该函数的作用域仅限于定义它的文件内,其他文件无法调用。这有助于实现信息隐藏和模块化编程。
  • sizeof 运算符
    • sizeof 用于计算数据类型或变量所占用的字节数。对于基本数据类型,如 intchar 等,sizeof 返回其固定的字节数;对于数组,sizeof 返回整个数组占用的字节数。例如:
#include <stdio.h>int main() {int arr[5];printf("%zu\n", sizeof(arr)); // 输出数组占用的总字节数,通常为 20(假设 int 为 4 字节)return 0;
}
- 当 `sizeof` 用于函数参数时,数组参数会退化为指针,因此 `sizeof` 返回的是指针的大小,而不是数组的大小。例如:
#include <stdio.h>void func(int arr[]) {printf("%zu\n", sizeof(arr)); // 输出指针的大小,通常为 4 或 8 字节
}int main() {int arr[5];func(arr);return 0;
}
  • 数组名与指针的关系
    • 数组名在大多数情况下会隐式转换为指向其首元素的指针,例如在函数调用、算术运算等场景中。如 int arr[5]; int *p = arr; 这里 arr 就转换为了指向 arr[0] 的指针。
    • 例外情况:当 sizeof 运算符作用于数组名时,它返回的是整个数组的大小;当 & 运算符作用于数组名时,得到的是指向整个数组的指针。例如:
#include <stdio.h>int main() {int arr[5];printf("%zu\n", sizeof(arr)); // 输出整个数组的大小printf("%p %p\n", arr, &arr); // arr 和 &arr 值相同,但类型不同return 0;
}
内存管理
  • malloccallocrealloc 函数的区别
    • malloc:用于分配指定大小的内存块,不进行初始化。例如:int *p = (int *)malloc(5 * sizeof(int)); 分配了 5 个 int 大小的内存块。
    • calloc:用于分配指定数量和大小的内存块,并将其初始化为 0。例如:int *p = (int *)calloc(5, sizeof(int)); 分配了 5 个 int 大小的内存块,并初始化为 0。
    • realloc:用于调整已分配内存块的大小。如果新的大小比原来大,可能会在原内存块后面追加内存;如果新的大小比原来小,可能会截断内存块。例如:
#include <stdio.h>
#include <stdlib.h>int main() {int *p = (int *)malloc(5 * sizeof(int));p = (int *)realloc(p, 10 * sizeof(int)); // 调整内存块大小为 10 个 intfree(p);return 0;
}
- **使用场景**:当只需要分配内存而不需要初始化时,使用 `malloc`;当需要分配内存并初始化为 0 时,使用 `calloc`;当需要调整已分配内存块的大小时,使用 `realloc`。
  • 检测和避免内存泄漏
    • 检测方法:可以使用工具如 Valgrind 来检测内存泄漏。Valgrind 会在程序运行时跟踪内存分配和释放情况,当发现有分配的内存未被释放时,会给出相应的提示。
    • 避免方法:遵循“谁分配,谁释放”的原则,确保每个 malloccallocrealloc 调用都有对应的 free 调用;在函数中分配的内存,如果需要在函数外部使用,要确保在合适的时机释放;可以使用智能指针或封装内存管理的函数来减少手动管理内存的错误。
  • 动态创建多维数组
    • 方法一:使用指针数组:可以先分配一个指针数组,然后为每个指针分配一维数组。例如:
#include <stdio.h>
#include <stdlib.h>int main() {int rows = 3, cols = 4;int **arr = (int **)malloc(rows * sizeof(int *));for (int i = 0; i < rows; i++) {arr[i] = (int *)malloc(cols * sizeof(int));}// 使用数组for (int i = 0; i < rows; i++) {free(arr[i]);}free(arr);return 0;
}
- **方法二:使用一维数组模拟多维数组**:可以将多维数组存储在一维数组中,通过计算偏移量来访问元素。例如:
#include <stdio.h>
#include <stdlib.h>int main() {int rows = 3, cols = 4;int *arr = (int *)malloc(rows * cols * sizeof(int));// 访问元素int element = arr[i * cols + j];free(arr);return 0;
}
- **优缺点**:指针数组的优点是可以方便地处理不规则的多维数组;缺点是内存分配不连续,可能会导致缓存命中率低。一维数组模拟多维数组的优点是内存分配连续,缓存命中率高;缺点是访问元素时需要手动计算偏移量,代码可读性可能较差。
预处理与编译
  • 预处理指令的作用
    • #define:用于定义宏,可以是简单的常量宏,也可以是带参数的宏。宏在预处理阶段会被直接替换,有助于提高代码的可维护性和可读性。例如:#define PI 3.14159
    • #ifdef#ifndef#endif:用于条件编译,可以根据宏的定义情况来选择编译哪些代码。例如:
#ifdef DEBUGprintf("Debug mode\n");
#endif
- **`#include`**:用于包含头文件,将头文件的内容插入到当前文件中。可以使用尖括号 `<>` 包含系统头文件,使用双引号 `""` 包含自定义头文件。
- **合理使用**:使用宏定义常量和函数可以提高代码的复用性;使用条件编译可以根据不同的平台或编译选项来选择不同的代码实现,提高代码的可移植性。
  • 宏定义和函数的区别
    • 区别:宏定义是在预处理阶段进行文本替换,没有函数调用的开销,但可能会导致代码膨胀;函数是在运行时调用,有参数传递、栈帧创建和销毁等开销,但代码更加安全和可维护。宏定义没有类型检查,可能会导致一些难以调试的错误;函数有严格的类型检查。
    • 潜在风险及避免方法:宏定义可能会导致运算符优先级问题,例如 #define SQUARE(x) x * x,当调用 SQUARE(2 + 3) 时,会得到 2 + 3 * 2 + 3 的结果。可以使用括号来避免这种问题,如 #define SQUARE(x) ((x) * (x))
  • 头文件的使用
    • 避免重复包含:可以使用头文件保护符,如 #ifndef#define#endif#pragma once。例如:
#ifndef MY_HEADER_H
#define MY_HEADER_H// 头文件内容#endif
- **避免命名冲突**:可以使用命名空间或命名约定来避免命名冲突。例如,将函数和变量命名为具有特定前缀的名称,如 `myproject_function`。

C++ 相关问题答案

面向对象编程
  • 封装、继承和多态
    • 封装:将数据和操作数据的函数捆绑在一起,隐藏对象的内部实现细节,只对外提供必要的接口。例如,一个 Circle 类封装了半径和计算面积、周长的方法:
#include <iostream>class Circle {
private:double radius;
public:Circle(double r) : radius(r) {}double getArea() { return 3.14159 * radius * radius; }double getCircumference() { return 2 * 3.14159 * radius; }
};int main() {Circle c(5);std::cout << "Area: " << c.getArea() << std::endl;std::cout << "Circumference: " << c.getCircumference() << std::endl;return 0;
}
- **继承**:允许一个类(派生类)继承另一个类(基类)的属性和方法,从而实现代码的复用和扩展。例如,`Rectangle` 类继承自 `Shape` 类:
#include <iostream>class Shape {
public:virtual double getArea() = 0;
};class Rectangle : public Shape {
private:double width, height;
public:Rectangle(double w, double h) : width(w), height(h) {}double getArea() override { return width * height; }
};int main() {Rectangle r(3, 4);std::cout << "Rectangle area: " << r.getArea() << std::endl;return 0;
}
- **多态**:允许不同的对象对同一消息做出不同的响应。通过虚函数和基类指针或引用实现。例如,上述代码中,`Shape` 类的 `getArea` 是虚函数,`Rectangle` 类重写了该函数,通过基类指针可以调用不同派生类的 `getArea` 方法:
#include <iostream>class Shape {
public:virtual double getArea() = 0;
};class Rectangle : public Shape {
private:double width, height;
public:Rectangle(double w, double h) : width(w), height(h) {}double getArea() override { return width * height; }
};class Circle : public Shape {
private:double radius;
public:Circle(double r) : radius(r) {}double getArea() override { return 3.14159 * radius * radius; }
};int main() {Rectangle r(3, 4);Circle c(5);Shape *shapes[2] = {&r, &c};for (int i = 0; i < 2; i++) {std::cout << "Area: " << shapes[i]->getArea() << std::endl;}return 0;
}
  • 虚函数和纯虚函数
    • 区别:虚函数是在基类中声明为 virtual 的函数,派生类可以重写该函数。纯虚函数是在基类中声明为 virtual 且赋值为 0 的函数,基类中不提供实现,派生类必须重写该函数。包含纯虚函数的类是抽象类,不能实例化。
    • 抽象类的应用场景:抽象类常用于定义接口,让派生类实现具体的功能。例如,在图形绘制系统中,Shape 类可以作为抽象类,定义 draw 纯虚函数,不同的图形类(如 CircleRectangle)继承自 Shape 类并实现 draw 方法。
  • 多重继承
    • 实现方式:一个派生类可以同时继承多个基类。例如:
class Base1 {
public:void func1() {}
};class Base2 {
public:void func2() {}
};class Derived : public Base1, public Base2 {
};
- **问题及解决方法**:多重继承可能会导致菱形继承问题,即一个派生类通过多条路径继承同一个基类,会导致基类成员在派生类中有多份拷贝。可以使用虚拟继承来解决这个问题,例如:
class Base {
public:int value;
};class Derived1 : virtual public Base {
};class Derived2 : virtual public Base {
};class FinalDerived : public Derived1, public Derived2 {
};

在上述代码中,使用 virtual 关键字进行虚拟继承,确保 Base 类的成员在 FinalDerived 类中只有一份拷贝。

模板与泛型编程
  • 模板的定义和使用
    • 函数模板:用于定义通用的函数,通过模板参数可以处理不同类型的数据。例如:
#include <iostream>template <typename T>
T max(T a, T b) {return (a > b) ? a : b;
}int main() {int x = 10, y = 20;std::cout << "Max: " << max(x, y) << std::endl;double a = 3.14, b = 2.71;std::cout << "Max: " << max(a, b) << std::endl;return 0;
}
- **类模板**:用于定义通用的类,通过模板参数可以创建不同类型的对象。例如:
#include <iostream>template <typename T>
class Stack {
private:T *data;int size;int capacity;
public:Stack(int cap) : capacity(cap), size(0) {data = new T[capacity];}~Stack() {delete[] data;}void push(T value) {if (size < capacity) {data[size++] = value;}}T pop() {if (size > 0) {return data[--size];}return T();}
};int main() {Stack<int> intStack(5);intStack.push(10);intStack.push(20);std::cout << "Popped: " << intStack.pop() << std::endl;return 0;
}
- **模板特化**:当模板在某些特定类型上需要有不同的实现时,可以使用模板特化。例如:
#include <iostream>template <typename T>
class MyClass {
public:void print() {std::cout << "Generic template" << std::endl;}
};template <>
class MyClass<int> {
public:void print() {std::cout << "Specialized template for int" << std::endl;}
};int main() {MyClass<double> obj1;obj1.print();MyClass<int> obj2;obj2.print();return 0;
}
  • 模板元编程
    • 实现编译时计算:模板元编程通过模板的实例化和递归展开来实现编译时计算。例如,计算阶乘:
template <int N>
struct Factorial {static const int value = N * Factorial<N - 1>::value;
};template <>
struct Factorial<0> {static const int value = 1;
};#include <iostream>int main() {std::cout << "Factorial of 5: " << Factorial<5>::value << std::endl;return 0;
}
- **应用场景**:模板元编程可以用于生成代码、优化性能、实现类型检查等。例如,在编译时计算数组的大小、实现编译时的类型转换等。
  • 调试模板相关的编译错误
    • 定位错误:模板编译错误信息通常很长且复杂,可以从错误信息的最后几行开始查看,定位到具体的模板实例化位置。可以使用逐步注释代码的方法,缩小错误范围。
    • 使用辅助工具:一些编译器提供了详细的模板调试信息,可以通过设置编译器选项来开启。例如,GCC 可以使用 -ftemplate-backtrace-limit=0 选项来显示完整的模板实例化回溯信息。
STL 标准模板库
  • 容器的特点和适用场景
    • vector:动态数组,支持随机访问,插入和删除操作在尾部效率较高,在中间或头部效率较低。适用于需要频繁随机访问元素,且插入和删除操作主要在尾部的场景。
    • list:双向链表,支持双向遍历,插入和删除操作效率高,但不支持随机访问。适用于需要频繁插入和删除元素,且不需要随机访问的场景。
    • map:关联容器,基于红黑树实现,存储键值对,键是唯一的,按照键的顺序排序。适用于需要根据键快速查找值的场景。
    • unordered_map:关联容器,基于哈希表实现,存储键值对,键是唯一的,不保证元素的顺序。适用于需要快速查找值,且对元素顺序没有要求的场景。
  • 迭代器的区别和用途
    • 输入迭代器:只能用于单向遍历容器,支持 ++ 操作,用于读取元素。例如,std::find 算法使用输入迭代器。
    • 输出迭代器:只能用于单向遍历容器,支持 ++ 操作,用于写入元素。例如,std::copy 算法使用输出迭代器。
    • 双向迭代器:支持双向遍历容器,支持 ++-- 操作。例如,std::list 的迭代器是双向迭代器。
    • 随机访问迭代器:支持随机访问容器元素,支持 ++--+- 等操作。例如,std::vector 的迭代器是随机访问迭代器。
  • 自定义比较函数
    • 可以通过定义一个函数对象或 lambda 表达式来作为比较函数。例如,对 vector 中的元素进行降序排序:
#include <iostream>
#include <vector>
#include <algorithm>bool compare(int a, int b) {return a > b;
}int main() {std::vector<int> vec = {3, 1, 4, 1, 5, 9};std::sort(vec.begin(), vec.end(), compare);for (int num : vec) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

也可以使用 lambda 表达式:

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {3, 1, 4, 1, 5, 9};std::sort(vec.begin(), vec.end(), [](int a, int b) { return a > b; });for (int num : vec) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

Qt 相关问题答案

Qt 基础与信号槽机制
  • 跨平台特性的实现及注意事项
    • 实现方式:Qt 使用了抽象层的概念,将不同平台的底层差异封装起来,提供统一的接口。例如,在不同平台上的窗口管理、输入输出等操作,Qt 会根据平台的不同调用相应的底层 API。
    • 注意事项:不同平台的字体、颜色、分辨率等可能会有所不同,需要进行适当的调整。在不同平台上,文件路径的表示方式也不同,需要使用 Qt 提供的跨平台文件路径处理函数。在某些平台上,可能会有特定的权限要求,需要在开发和部署时进行相应的处理。
  • 信号槽机制
    • 概念:信号是对象发出的事件通知,槽是处理信号的函数。当一个信号被发射时,与之连接的槽函数会被调用。
    • connect 函数的使用connect 函数用于建立信号和槽的连接。例如:
#include <QApplication>
#include <QPushButton>
#include <QWidget>void mySlot() {std::cout << "Button clicked!" << std::endl;
}int main(int argc, char *argv[]) {QApplication app(argc, argv);QWidget window;QPushButton button("Click me", &window);QObject::connect(&button, &QPushButton::clicked, &mySlot);window.show();return app.exec();
}
  • 信号和槽参数不匹配的处理
    • 当信号和槽的参数不匹配时,Qt 会根据情况进行处理。如果信号的参数比槽的参数多,多余的参数会被忽略;如果信号的参数比槽的参数少,会导致编译错误。可以使用 lambda 表达式来实现参数的转换或忽略,例如:
#include <QApplication>
#include <QPushButton>
#include <QWidget>int main(int argc, char *argv[]) {QApplication app(argc, argv);QWidget window;QPushButton button("Click me", &window);QObject::connect(&button, &QPushButton::clicked, [](bool checked) {std::cout << "Button clicked!" << std::endl;});window.show();return app.exec();
}
Qt 界面设计与布局管理
  • 界面设计方式的优缺点及选择
    • Qt Designer:优点是可视化设计,直观方便,能够快速搭建界面;缺点是对于复杂的界面布局和动态界面,可能不够灵活。适用于简单的界面设计和快速原型开发。
    • 手动编写代码:优点是灵活性高,能够实现复杂的界面布局和动态界面;缺点是开发效率相对较低,需要对 Qt 的界面类和布局管理器有深入的了解。适用于对界面有特殊要求和需要高度定制的场景。
  • 布局管理器的作用和使用
    • 作用:布局管理器用于自动管理界面元素的大小和位置,使界面在不同的窗口大小和分辨率下都能保持良好的布局。
    • 合理使用:根据界面的需求选择合适的布局管理器,例如,垂直布局使用 QVBoxLayout,水平布局使用 QHBoxLayout,网格布局使用 QGridLayout。可以嵌套使用布局管理器来实现复杂的界面布局。例如:
#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QPushButton>int main(int argc, char *argv[]) {QApplication app(argc, argv);QWidget window;QVBoxLayout *layout = new QVBoxLayout(&window);QPushButton *button1 = new QPushButton("Button 1", &window);QPushButton *button2 = new QPushButton("Button 2", &window);layout->addWidget(button1);layout->addWidget(button2);window.show();return app.exec();
}
  • 自定义控件的实现及注意事项
    • 实现方式:可以通过继承 QWidget 或其他 Qt 控件类,重写 paintEvent 函数来绘制自定义的界面,重写 mousePressEventmouseMoveEvent 等事件处理函数来处理用户交互。例如:
#include <QApplication>
#include <QWidget>
#include <QPainter>class MyWidget : public QWidget {
protected:void paintEvent(QPaintEvent *event) override {QPainter painter(this);painter.drawRect(10, 10, 100, 100);}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);MyWidget window;window.show();return app.exec();
}
- **注意事项**:要考虑控件的样式,确保与整个界面的风格一致。要正确处理事件,避免出现意外的行为。要考虑控件的可维护性和可扩展性,便于后续的修改和功能添加。
Qt 多线程与并发编程
  • QThread 类的使用及优势
    • 使用方法:可以通过继承 QThread 类,重写 run 函数来实现自定义的线程。例如:
#include <QApplication>
#include <QThread>
#include <QDebug>class MyThread : public QThread {
protected:void run() override {for (int i = 0; i < 10; i++) {qDebug() << "Thread: " << i;msleep(1000);}}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);MyThread thread;thread.start();return app.exec();
}
- **优势**:`QThread` 与 Qt 的事件循环系统集成良好,可以方便地在线程中使用信号槽机制。`QThread` 提供了一些方便的函数,如 `start`、`quit`、`wait` 等,用于管理线程的生命周期。
  • 界面更新问题及解决方法
    • 问题:在 Qt 中,只能在主线程(即 GUI 线程)中更新界面元素,否则会导致界面更新异常或崩溃。
    • 解决方法:可以使用信号槽机制将需要更新界面的操作发送到主线程中执行。例如:
#include <QApplication>
#include <QThread>
#include <QDebug>
#include <QPushButton>
#include <QWidget>class WorkerThread : public QThread {Q_OBJECT
signals:void updateUI();
protected:void run() override {for (int i = 0; i < 10; i++) {msleep(1000);emit updateUI();}}
};class MainWindow : public QWidget {Q_OBJECT
public:MainWindow(QWidget *parent = nullptr) : QWidget(parent) {button = new QPushButton("Click me", this);thread = new WorkerThread(this);connect(thread, &WorkerThread::updateUI, this, &MainWindow::onUpdateUI);thread->start();}
private slots:void onUpdateUI() {button->setText("Updated");}
private:QPushButton *button;WorkerThread *thread;
};#include "main.moc"int main(int argc, char *argv[]) {QApplication app(argc, argv);MainWindow window;window.show();return app.exec();
}
  • 线程同步工具的使用和适用场景
    • QMutex:用于保护共享资源,确保同一时间只有一个线程可以访问共享资源。例如:
#include <QApplication>
#include <QThread>
#include <QMutex>
#include <QDebug>QMutex mutex;
int sharedData = 0;class WorkerThread : public QThread {
protected:void run() override {for (int i = 0; i < 100000; i++) {mutex.lock();sharedData++;mutex.unlock();}}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);WorkerThread thread1, thread2;thread1.start();thread2.start();thread1.wait();thread2.wait();qDebug() << "Shared data: " << sharedData;return app.exec();
}
- **`QSemaphore`**:用于控制同时访问共享资源的线程数量。例如,当有多个线程需要访问一个有限数量的资源时,可以使用 `QSemaphore` 来限制并发访问的线程数量。
- **适用场景**:`QMutex` 适用于保护共享资源,避免数据竞争;`QSemaphore` 适用于控制资源的并发访问数量,如线程池中的线程数量控制。 
  • 在这里插入图片描述

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

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

相关文章

实现实时数据推送:SpringBoot中SSE接口的两种方法

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

LXC 导入多Linux系统

前提要求 ubuntu下安装lxd 参考Rockylinux下安装lxd 参考LXC 源替换参考LXC 容器端口发布参考LXC webui 管理<

ES的文档更新机制

想获取更多高质量的Java技术文章&#xff1f;欢迎访问Java技术小馆官网&#xff0c;持续更新优质内容&#xff0c;助力技术成长 Java技术小馆官网https://www.yuque.com/jtostring ES的文档更新机制 在现代应用中&#xff0c;数据的动态性越来越强&#xff0c;我们不仅需要快…

trae.ai 编辑器:前端开发者的智能效率革命

一、为什么我们需要更智能的编辑器&#xff1f; 作为从业5年的前端开发者&#xff0c;我使用过从Sublime到VSCode的各种编辑器。但随着现代前端技术的复杂度爆炸式增长&#xff08;想想一个React组件可能涉及JSX、CSS-in-JS、TypeScript和GraphQL&#xff09;&#xff0c;传统…

MySQL篇(一):慢查询定位及索引、B树相关知识详解

MySQL篇&#xff08;一&#xff09;&#xff1a;慢查询定位及索引、B树相关知识详解 MySQL篇&#xff08;一&#xff09;&#xff1a;慢查询定位及索引、B树相关知识详解一、MySQL中慢查询的定位&#xff08;一&#xff09;慢查询日志的开启&#xff08;二&#xff09;慢查询日…

uniapp APP端在线升级(简版)

设计思路&#xff1a; 1.版本比较&#xff1a;应用程序检查其当前版本与远程服务器上可用的最新版本 2. 更新状态指示&#xff1a;如果应用程序是不是最新的版本&#xff0c;则页面提示下载最新版本。 3.下载启动&#xff1a;通过plus.downloader.createDownload()启动新应用…

基于javaweb的SpringBoot教务课程管理设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

使用大语言模型进行Python图表可视化

Python使用matplotlib进行可视化一直有2个问题&#xff0c;一是代码繁琐&#xff0c;二是默认模板比较丑。因此发展出seaborn等在matplotlib上二次开发&#xff0c;以更少的代码进行画图的和美化的库&#xff0c;但是这也带来了定制化不足的问题。在大模型时代&#xff0c;这个…

【JavaEE】MyBatis - Plus

目录 一、快速使用二、CRUD简单使用三、常见注解3.1 TableName3.2 TableFiled3.3 TableId 四、条件构造器4.1 QueryWrapper4.2 UpdateWrapper4.3 LambdaQueryWrapper4.4 LambdaUpdateWrapper 五、自定义SQL 一、快速使用 MyBatis Plus官方文档&#xff1a;MyBatis Plus官方文档…

采用前端技术开源了一个数据结构算法的可视化工具

今天要推荐的开源项目叫VisuAlgoX,是一个面向计算机科学和游戏开发的 交互式算法可视化工具&#xff0c;帮助用户通过直观的动画理解各种数据结构和算法。 项目的前身 由于最近在做一些关于游戏和图形化方面的文章&#xff0c;因此做了一部分相关算法的动态可视化来做配图展示…

体验智谱清言的AutoGLM进行自动化的操作(Chrome插件)

最近体验了很多的大模型&#xff0c;大模型我是一直关注着ChatGLM&#xff0c;因为它确实在7b和8b这档模型里&#xff0c;非常聪明&#xff01; 最近还体验了很多大模型的应用软件&#xff0c;比如Agently、5ire、 mcphost、 Dive、 NextChat等。但是这些一般都是图形界面或者…

pytorch中dataloader自定义数据集

前言 在深度学习中我们需要使用自己的数据集做训练&#xff0c;因此需要将自定义的数据和标签加载到pytorch里面的dataloader里&#xff0c;也就是自实现一个dataloader。 数据集处理 以花卉识别项目为例&#xff0c;我们分别做出图片的训练集和测试集&#xff0c;训练集的标…

Blender模型导入虚幻引擎设置

单位系统不一致 Blender默认单位是米&#xff08;Meters&#xff09;&#xff0c;而虚幻引擎默认使用**厘米&#xff08;Centimeters&#xff09;**作为单位。 当模型从Blender导出为FBX或其他格式时&#xff0c;如果没有调整单位&#xff0c;虚幻引擎会将1米&#xff08;Blen…

Docker基础详解

Docker 技术详解 一、概述 Docker官网&#xff1a;https://docs.docker.com/ 菜鸟教程&#xff1a;https://www.runoob.com/docker/docker-tutorial.html 1.1 什么是Docker&#xff1f; Docker 是一个开源的容器化平台&#xff0c;它允许开发者将应用程序和其依赖项打包到…

FastPillars:一种易于部署的基于支柱的 3D 探测器

FastPillars&#xff1a;一种易于部署的基于支柱的 3D 探测器Report issue for preceding element Sifan Zhou 1 , Zhi Tian 2 , Xiangxiang Chu 2 , Xinyu Zhang 2 , Bo Zhang 2 , Xiaobo Lu11{}^{1}start_FLOATSUPERSCRIPT 1 end_FLOATSUPERSCRIPT11footnotemark: 1 Chengji…

NLP语言模型训练里的特殊向量

1. CLS 向量和 DEC 向量的区别及训练方式 (1) CLS 向量与 DEC 向量是否都是特殊 token&#xff1f; CLS 向量&#xff08;[CLS] token&#xff09;和 DEC 向量&#xff08;Decoder Input token&#xff09;都是特殊的 token&#xff0c;但它们出现在不同类型的 NLP 模型中&am…

字节跳动 UI-TARS 汇总整理报告

1. 摘要 UI-TARS 是字节跳动开发的一种原生图形用户界面&#xff08;GUI&#xff09;代理模型 。它将感知、行动、推理和记忆整合到一个统一的视觉语言模型&#xff08;VLM&#xff09;中 。UI-TARS 旨在跨桌面、移动和 Web 平台实现与 GUI 的无缝交互 。实验结果表明&#xf…

基于Python深度学习的鲨鱼识别分类系统

摘要&#xff1a;鲨鱼是海洋环境健康的指标&#xff0c;但受到过度捕捞和数据缺乏的挑战。传统的观察方法成本高昂且难以收集数据&#xff0c;特别是对于具有较大活动范围的物种。论文讨论了如何利用基于媒体的远程监测方法&#xff0c;结合机器学习和自动化技术&#xff0c;来…

【漫话机器学习系列】168.最大最小值缩放(Min-Max Scaling)

在机器学习和数据预处理中&#xff0c;特征缩放&#xff08;Feature Scaling&#xff09; 是一个至关重要的步骤&#xff0c;它可以使模型更稳定&#xff0c;提高训练速度&#xff0c;并优化收敛效果。最大最小值缩放&#xff08;Min-Max Scaling&#xff09; 是其中最常见的方…

开源测试用例管理平台

不可错过的10个开源测试用例管理平台&#xff1a; PingCode、TestLink、Kiwi TCMS、Squash TM、FitNesse、Tuleap、Robot Framework、SpecFlow、TestMaster、Nitrate。 开源测试用例管理工具提供了一种透明、灵活的解决方案&#xff0c;使团队能够在不受限的情况下适应具体的测…