面試問題總結: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.pswp.cn/news/899837.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899837.shtml
英文地址,請注明出處:http://en.pswp.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;使團隊能夠在不受限的情況下適應具體的測…