最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt優(yōu)雅實現(xiàn)線程安全單例模式(模板化和自動清理)

 更新時間:2025年11月21日 09:24:03   作者:喵個咪  
在 Qt 開發(fā)中,單例模式是高頻使用的設計模式,本文將基于模板封裝 + 管理器的設計思路,實現(xiàn)一套可直接復用的單例框架,并詳細講解其設計原理與最佳實踐,有需要的可以了解下

在 Qt 開發(fā)中,單例模式是高頻使用的設計模式,用于全局共享一個實例(如配置管理、網(wǎng)絡服務、日志系統(tǒng)等)。一個健壯的 Qt 單例需要滿足 線程安全、自動清理、通用性強、支持任意構造參數(shù) 等核心需求。本文將基于模板封裝 + 管理器的設計思路,實現(xiàn)一套可直接復用的單例框架,并詳細講解其設計原理與最佳實踐。

一、單例模式的核心訴求

在 Qt 環(huán)境中,單例的設計需要解決以下關鍵問題:

  • 線程安全: 多線程并發(fā)調用時避免創(chuàng)建多個實例;
  • 自動清理: 程序退出時自動釋放資源,避免內存泄漏(尤其配合 Qt 的 QCoreApplication::aboutToQuit 機制);
  • 通用性: 支持任意類作為單例,無需重復編寫單例邏輯;
  • 靈活構造: 支持帶參數(shù)的構造函數(shù),且不丟失參數(shù)語義;
  • 安全校驗: 避免未初始化就調用實例的錯誤;
  • 可手動控制: 支持主動初始化 / 銷毀單例。

本文實現(xiàn)的單例框架完全滿足以上需求,且兼容 Qt 控制臺程序、桌面程序等所有場景。

二、實現(xiàn)架構設計

整體架構分為兩層:

  • Singleton 模板類: 負責單例的實例創(chuàng)建、線程安全保護、初始化 / 銷毀邏輯,通過模板實現(xiàn)通用性;
  • SingletonManager 單例管理器: 負責注冊所有單例的清理回調,程序退出時統(tǒng)一執(zhí)行銷毀,避免內存泄漏。

核心設計思路:

  • 模板化封裝單例邏輯,避免重復編碼;
  • QMutex 保證多線程下的實例創(chuàng)建 / 訪問安全;
  • 完美轉發(fā)(std::forward)支持任意構造參數(shù);
  • 清理回調注冊到管理器,利用 Qt 的 aboutToQuit 統(tǒng)一觸發(fā);
  • 斷言(Q_ASSERT)+ 宏定義簡化使用,同時提供安全校驗。

三、完整代碼詳解

3.1 單例管理器:SingletonManager.h

管理器的核心作用是「集中管理所有單例的清理邏輯」,避免每個單例單獨處理銷毀,確保退出時資源釋放的一致性。

#ifndef SINGLETONMANAGER_H
#define SINGLETONMANAGER_H

#include <QMutex>
#include <functional>
#include <map>
#include <QObject> // 確保 Q_DISABLE_COPY_MOVE 可用

// 單例管理器:統(tǒng)一注冊/注銷/執(zhí)行單例清理回調
class SingletonManager {
public:
    // 管理器自身是單例(懶加載,線程安全)
    static SingletonManager &instance() {
        static SingletonManager inst; // C++11 后靜態(tài)局部變量初始化線程安全
        return inst;
    }

    /**
     * @brief 注冊單例清理回調
     * @param fn 清理函數(shù)(通常是刪除單例實例的 lambda)
     * @return 注冊 ID(用于后續(xù)注銷),ID > 0
     */
    int registerCleanup(std::function<void()> fn) {
        QMutexLocker locker(&m_mutex); // 加鎖保證線程安全
        int id = m_nextId++;
        m_funcs.emplace(id, std::move(fn)); // 轉移函數(shù)所有權,避免拷貝開銷
        return id;
    }

    /**
     * @brief 注銷清理回調(支持重復調用,安全可重入)
     * @param id 注冊時返回的 ID
     */
    void unregisterCleanup(const int id) {
        QMutexLocker locker(&m_mutex);
        m_funcs.erase(id); // 不存在的 ID 無副作用
    }

    /**
     * @brief 執(zhí)行所有注冊的清理回調(程序退出時調用)
     * 特點:拷貝回調列表后再執(zhí)行,避免回調中操作管理器導致死鎖
     */
    void cleanupAll() {
        std::map<int, std::function<void()>> copyFuncs;
        {
            // 局部作用域:釋放鎖后再執(zhí)行回調,提高并發(fā)效率
            QMutexLocker locker(&m_mutex);
            copyFuncs = m_funcs; // 拷貝回調列表
            m_funcs.clear();     // 清空原列表,避免重復執(zhí)行
        }

        // 按注冊順序執(zhí)行回調(map 是有序容器,key 遞增)
        for (auto &[id, func] : copyFuncs) {
            if (func) {
                try {
                    func(); // 執(zhí)行清理邏輯
                } catch (...) {
                    // 捕獲所有異常,避免單個單例清理失敗影響其他
                    qWarning() << "[SingletonManager] Cleanup failed for id:" << id;
                }
            }
        }
    }

private:
    // 私有構造/析構:禁止外部創(chuàng)建實例
    SingletonManager() = default;
    ~SingletonManager() = default;

    // 禁用拷貝/移動:確保管理器全局唯一
    Q_DISABLE_COPY_MOVE(SingletonManager)

    QMutex m_mutex;                          // 保護回調列表的線程安全
    std::map<int, std::function<void()>> m_funcs; // 存儲清理回調(有序)
    int m_nextId{1};                         // 回調注冊 ID 生成器(從 1 開始,0 為無效 ID)
};

#endif // SINGLETONMANAGER_H

設計亮點:

  • 自身是單例: 靜態(tài)局部變量初始化(C++11 線程安全),無需額外加鎖;
  • 線程安全: 所有對回調列表的操作都通過 QMutex 保護;
  • 安全清理: 拷貝回調列表后釋放鎖,避免回調中調用 unregisterCleanup 導致死鎖;
  • 異常隔離: 單個單例清理失敗不影響其他,提高程序穩(wěn)定性;
  • 有序執(zhí)行: std::map 保證清理順序與注冊順序一致,解決單例依賴問題。

3.2 單例模板類:Singleton.h

模板類是單例框架的核心,通過泛型封裝通用邏輯,支持任意類作為單例,無需修改目標類代碼。

#ifndef SINGLETON_H
#define SINGLETON_H

#include <QMutexLocker>
#include <QCoreApplication>
#include <QDebug>
#include <type_traits>
#include <utility> // 用于 std::forward

#include "SingletonManager.h"

// 靜態(tài)斷言:確保 T 是可構造的(避免抽象類作為單例)
template<typename T>
constexpr bool is_singleton_valid_v = std::is_constructible_v<T> && !std::is_abstract_v<T>;

// 單例模板類:支持帶參數(shù)構造、自動注冊清理、線程安全訪問
template<typename T>
class Singleton {
    // 編譯期校驗:若 T 不可構造或為抽象類,直接報錯
    static_assert(is_singleton_valid_v<T>, 
                  "Singleton<T> requires T to be constructible and non-abstract");

public:
    /**
     * @brief 初始化單例(必須在調用 instance() 前執(zhí)行)
     * @tparam Args 構造函數(shù)參數(shù)類型
     * @param args 構造函數(shù)參數(shù)(完美轉發(fā),支持左值/右值)
     * 特點:自動注冊清理回調到 SingletonManager,支持重復調用(僅首次有效)
     */
    template<typename... Args>
    static void init(Args &&... args) {
        QMutexLocker lockerInit(&mutex()); // 加鎖保證初始化線程安全
        if (instanceRef() != nullptr) {
            qWarning() << "[Singleton] " << typeid(T).name() << " has already been initialized";
            return;
        }

        // 完美轉發(fā)參數(shù),創(chuàng)建單例實例(支持任意構造參數(shù))
        instanceRef() = new T(std::forward<Args>(args)...);

        // 注冊清理回調(僅首次初始化時注冊)
        if (regIdRef() == 0) {
            regIdRef() = SingletonManager::instance().registerCleanup([] {
                QMutexLocker lockerCleanup(&mutex());
                delete instanceRef(); // 釋放單例實例
                instanceRef() = nullptr; // 重置指針,避免野指針
                qDebug() << "[Singleton] " << typeid(T).name() << " cleaned up";
            });
        }
    }

    /**
     * @brief 獲取單例實例指針(線程安全)
     * @return T* 單例指針(非空,調試模式下為空會觸發(fā)斷言)
     * 注意:必須先調用 init() 初始化,否則調試模式斷言失敗,release 模式可能崩潰
     */
    static T *instance() {
        QMutexLocker locker(&mutex());
        Q_ASSERT_X(instanceRef() != nullptr, 
                   "Singleton::instance()", 
                   qPrintable(QString("%1 not initialized! Call Singleton<%1>::init() first.").arg(typeid(T).name())));
        return instanceRef();
    }

    /**
     * @brief 手動銷毀單例(主動釋放資源)
     * 特點:銷毀后可重新調用 init() 再次初始化,支持動態(tài)啟停
     */
    static void shutdown() {
        QMutexLocker locker(&mutex());
        if (instanceRef() != nullptr) {
            delete instanceRef();
            instanceRef() = nullptr;
            qDebug() << "[Singleton] " << typeid(T).name() << " shut down manually";
        }

        // 注銷清理回調(避免重復銷毀)
        if (regIdRef() != 0) {
            SingletonManager::instance().unregisterCleanup(regIdRef());
            regIdRef() = 0;
        }
    }

    // 禁用默認構造/析構:禁止創(chuàng)建 Singleton 實例(僅通過靜態(tài)方法訪問)
    Singleton() = delete;
    ~Singleton() = delete;

    // 禁用拷貝/移動:確保單例唯一性
    Singleton(const Singleton &) = delete;
    Singleton &operator=(const Singleton &) = delete;
    Singleton(Singleton &&) = delete;
    Singleton &operator=(Singleton &&) = delete;

private:
    /**
     * @brief 獲取單例實例引用(靜態(tài)局部變量,懶加載)
     * 注意:靜態(tài)局部變量初始化線程安全(C++11 標準)
     */
    static T *&instanceRef() {
        static T *inst = nullptr;
        return inst;
    }

    /**
     * @brief 獲取互斥鎖引用(靜態(tài)局部變量,懶加載)
     * 每個單例類擁有獨立的互斥鎖,避免不同單例間鎖競爭
     */
    static QMutex &mutex() {
        static QMutex m;
        return m;
    }

    /**
     * @brief 獲取清理回調注冊 ID 引用
     * 用于跟蹤是否已注冊清理回調,避免重復注冊
     */
    static int &regIdRef() {
        static int id = 0;
        return id;
    }
};

/**
 * @def GET_SINGLETON(Type)
 * @brief 獲取單例指針(可能為 nullptr,需自行判空)
 * 適用場景:允許單例未初始化的場景(如可選功能模塊)
 */
#define GET_SINGLETON(Type) (Singleton<Type>::instance())

/**
 * @def GET_SINGLETON_REF(Type)
 * @brief 獲取單例引用(調試模式下未初始化會觸發(fā)斷言)
 * 適用場景:確保單例必須存在的核心模塊(如配置管理)
 */
#define GET_SINGLETON_REF(Type) ([]() -> Type & { \
    Type *p = Singleton<Type>::instance();       \
    Q_ASSERT_X(p != nullptr, "GET_SINGLETON_REF", "Singleton not initialized"); \
    return *p;                                   \
}())

/**
 * @def GET_SINGLETON_OR(Type, alt)
 * @brief 獲取單例指針,若未初始化則返回替代值
 * 適用場景:需要降級策略的場景(如備用服務)
 */
#define GET_SINGLETON_OR(Type, alt) (Singleton<Type>::instance() ? Singleton<Type>::instance() : (alt))

#endif // SINGLETON_H

設計亮點:

  • 編譯期校驗: 通過 static_assert 禁止抽象類、不可構造類作為單例,提前暴露錯誤;
  • 完美轉發(fā): std::forward 保留構造參數(shù)的左值 / 右值屬性,支持任意構造參數(shù)(包括臨時對象);
  • 獨立鎖機制: 每個單例類擁有自己的 QMutex,避免不同單例間的鎖競爭,提高并發(fā)效率;
  • 靈活控制: 支持 init() 重復調用(冪等性)、shutdown() 手動銷毀后重新初始化;
  • 安全宏定義: 提供三種訪問宏,適配不同使用場景,調試模式下有明確斷言提示。

3.3 目標單例類示例:MyService.h

為了讓示例更完整,這里提供一個典型的 Qt 單例類實現(xiàn)(支持信號槽、帶參數(shù)構造):

#ifndef MYSERVICE_H
#define MYSERVICE_H

#include <QObject>
#include <QString>
#include <QDebug>

// 示例單例類:網(wǎng)絡服務管理(支持信號槽,帶參數(shù)構造)
class MyService : public QObject {
    Q_OBJECT
public:
    /**
     * @brief 帶參數(shù)構造函數(shù)(單例的構造參數(shù)通過 Singleton::init() 傳遞)
     * @param serverUrl 服務端地址
     * @param port 服務端口
     * @param parent 父對象(建議設為 nullptr,避免生命周期沖突)
     */
    explicit MyService(const QString &serverUrl, int port, QObject *parent = nullptr) 
        : QObject(parent), m_serverUrl(serverUrl), m_port(port) {
        qDebug() << "[MyService] Initialized with URL:" << serverUrl << ", port:" << port;
    }

    ~MyService() override {
        qDebug() << "[MyService] Destructor called";
    }

    // 示例業(yè)務方法
    void doSomething() {
        qDebug() << "[MyService] Doing something with" << m_serverUrl << ":" << m_port;
        // 實際業(yè)務邏輯:如網(wǎng)絡請求、數(shù)據(jù)處理等
    }

signals:
    // 示例信號:如服務狀態(tài)變化
    void serviceReady();

private:
    QString m_serverUrl; // 服務端地址
    int m_port;          // 服務端口
};

#endif // MYSERVICE_H

注意事項:

  • 單例類若繼承 QObject,建議將父對象設為 nullptr,避免 Qt 父子對象生命周期管理與單例沖突;
  • 構造函數(shù)需為 publicprotected(若為 protected,需將 Singleton<T> 設為友元);
  • 避免在構造函數(shù)中執(zhí)行耗時操作(如網(wǎng)絡連接),可提供 initService() 等方法延遲初始化。

3.4 完整使用示例(main 函數(shù))

#include <QCoreApplication>
#include <QTimer>
#include "SingletonManager.h"
#include "Singleton.h"
#include "MyService.h"

int main(int argc, char *argv[]) {
    // 1. 必須先創(chuàng)建 QCoreApplication(QMutex、QObject 等依賴 Qt 環(huán)境初始化)
    QCoreApplication app(argc, argv);

    // 2. 連接 aboutToQuit 信號,程序退出時統(tǒng)一清理單例
    QObject::connect(&app, &QCoreApplication::aboutToQuit, []() {
        qDebug() << "\n[Main] Starting singleton cleanup...";
        SingletonManager::instance().cleanupAll();
        qDebug() << "[Main] Singleton cleanup finished";
    });

    // 3. 初始化單例(傳遞構造參數(shù),自動注冊清理回調)
    Singleton<MyService>::init("http://example.com", 8080);

    // 4. 三種訪問單例的方式
    // 方式1:獲取指針(需手動判空,適合可選模塊)
    MyService *svcPtr = GET_SINGLETON(MyService);
    if (svcPtr) {
        svcPtr->doSomething();
    }

    // 方式2:獲取引用(調試模式斷言非空,適合核心模塊)
    MyService &svcRef = GET_SINGLETON_REF(MyService);
    svcRef.doSomething();

    // 方式3:獲取指針或替代值(適合降級策略)
    MyService *svcOr = GET_SINGLETON_OR(MyService, nullptr);
    if (svcOr) {
        svcOr->doSomething();
    }

    // 5. 示例:手動銷毀單例(可選)
    QTimer::singleShot(2000, []() {
        qDebug() << "\n[Main] Shutting down MyService manually...";
        Singleton<MyService>::shutdown();

        // 銷毀后可重新初始化
        qDebug() << "[Main] Reinitializing MyService...";
        Singleton<MyService>::init("http://new-example.com", 9090);
        GET_SINGLETON_REF(MyService).doSomething();
    });

    // 6. 3秒后退出程序(觸發(fā) aboutToQuit 清理)
    QTimer::singleShot(3000, &app, &QCoreApplication::quit);

    return app.exec();
}

運行輸出:

[MyService] Initialized with URL: "http://example.com" , port: 8080
[MyService] Doing something with "http://example.com" : 8080
[MyService] Doing something with "http://example.com" : 8080
[MyService] Doing something with "http://example.com" : 8080

[Main] Shutting down MyService manually...
[MyService] Destructor called
[Singleton] MyService cleaned up
[Main] Reinitializing MyService...
[MyService] Initialized with URL: "http://new-example.com" , port: 9090
[MyService] Doing something with "http://new-example.com" : 9090

[Main] Starting singleton cleanup...
[MyService] Destructor called
[Singleton] MyService cleaned up
[Main] Singleton cleanup finished

四、核心注意事項

4.1 初始化順序

  • 必須先創(chuàng)建 QCoreApplication QMutex、QObject 等 Qt 組件依賴 Qt 環(huán)境初始化,因此 QCoreApplication 必須在 Singleton::init() 之前創(chuàng)建;
  • 單例依賴順序: 若單例 A 依賴單例 B,需先初始化 B 再初始化 A(清理順序與注冊順序一致,即先清理 A 再清理 B,避免依賴失效)。

4.2 線程安全

  • 初始化線程安全: init() 方法通過 QMutex 保護,多線程并發(fā)調用僅首次初始化有效;
  • 訪問線程安全: instance() 方法通過 QMutex 保護,避免多線程同時訪問未初始化的實例;
  • 單例內部線程安全: 本文框架僅保證實例創(chuàng)建 / 銷毀的線程安全,單例類自身的成員函數(shù)需根據(jù)業(yè)務需求添加鎖(如 QMutex)。

4.3 禁止拷貝移動

  • 單例類必須禁用拷貝構造、賦值運算符(通過 Q_DISABLE_COPY_MOVE 或手動刪除),否則可能通過拷貝創(chuàng)建多個實例;
  • Singleton<T> 模板已禁用拷貝移動,目標單例類需自行禁用(如示例 MyService 雖未顯式禁用,但繼承 QObject 后自動禁用)。

4.4 內存泄漏防護

  • 必須連接 QCoreApplication::aboutToQuitSingletonManager::cleanupAll(),否則程序異常退出時可能導致內存泄漏;
  • 若單例類繼承 QObject,禁止將其設為其他 QObject 的子對象(否則 Qt 可能自動銷毀實例,導致二次釋放)。

4.5 調試與 Release 模式差異

  • 調試模式(Debug):instance()、GET_SINGLETON_REF 會觸發(fā)斷言,快速定位未初始化的錯誤;
  • 發(fā)布模式(Release):斷言失效,instance() 可能返回 nullptr,需自行判空(建議核心模塊使用 GET_SINGLETON_REF,非核心模塊使用 GET_SINGLETON 并判空)。

五、進階用法

5.1 懶加載單例(無需手動 init)

默認實現(xiàn)需要手動調用 init(),若需懶加載(首次調用 instance() 時自動初始化),可修改 instance() 方法:

static T *instance() {
    QMutexLocker locker(&mutex());
    if (instanceRef() == nullptr) {
        // 無參構造(若需帶參數(shù),需調整設計,如全局配置)
        instanceRef() = new T();
        // 自動注冊清理回調
        if (regIdRef() == 0) {
            regIdRef() = SingletonManager::instance().registerCleanup([] {
                QMutexLocker locker(&mutex());
                delete instanceRef();
                instanceRef() = nullptr;
            });
        }
    }
    return instanceRef();
}

注意: 懶加載模式僅支持無參構造,若需帶參數(shù),需通過全局配置或其他方式傳遞參數(shù)。

5.2 單例銷毀優(yōu)先級

若需控制單例的銷毀順序(如先銷毀依賴方,再銷毀被依賴方),可擴展 SingletonManager 支持優(yōu)先級:

// 修改 SingletonManager 的注冊接口,增加優(yōu)先級參數(shù)
int registerCleanup(std::function<void()> fn, int priority = 0) {
    QMutexLocker locker(&m_mutex);
    int id = m_nextId++;
    // 用 pair<priority, id> 作為 key,按優(yōu)先級降序排序(優(yōu)先級高的先清理)
    m_funcs.emplace(std::make_pair(-priority, id), std::move(fn));
    return id;
}

// 對應的 map 類型修改為:
std::map<std::pair<int, int>, std::function<void()>> m_funcs;

使用時指定優(yōu)先級:

// 高優(yōu)先級(先清理)
Singleton<MyService>::initWithPriority(10, "http://example.com", 8080);

5.3 線程局部單例(TLS)

若需每個線程擁有獨立的單例實例(如線程局部緩存),可修改 instanceRef() 為線程局部變量:

static T *&instanceRef() {
    thread_local T *inst = nullptr; // 線程局部變量,每個線程獨立
    return inst;
}

static QMutex &mutex() {
    thread_local QMutex m; // 每個線程獨立的鎖
    return m;
}

注意:線程局部單例的清理需在線程退出時手動調用 shutdown(),避免線程泄漏。

六、常見問題排查

6.1 斷言失?。篠ingleton not initialized

  • 原因:未調用 Singleton::init() 就調用 instance()GET_SINGLETON_REF;
  • 解決:確保 init()instance() 之前調用,且 QCoreApplication 已創(chuàng)建。

6.2 內存泄漏(Valgrind 檢測到泄漏)

  • 原因:未連接 QCoreApplication::aboutToQuitSingletonManager::cleanupAll();
  • 解決:在 main 函數(shù)中添加連接代碼。

6.3 二次釋放崩潰

  • 原因:單例類被 Qt 父子對象管理(如設置了父對象),導致 Qt 自動銷毀后,SingletonManager 再次銷毀;
  • 解決:單例類構造時父對象設為 nullptr,禁止將單例設為其他 QObject 的子對象。

6.4 多線程并發(fā)初始化導致崩潰

  • 原因:使用了 C++11 之前的編譯器(靜態(tài)局部變量初始化非線程安全);
  • 解決:升級編譯器到支持 C++11 及以上標準,或手動為 instanceRef() 加鎖。

七、框架優(yōu)勢總結

本文實現(xiàn)的單例框架相比傳統(tǒng)單例(如餓漢式、懶漢式),具有以下優(yōu)勢:

  • 通用性強: 模板化設計,支持任意可構造類,無需修改目標類代碼;
  • 線程安全: 基于 QMutex 實現(xiàn)初始化 / 訪問安全,兼容 Qt 多線程環(huán)境;
  • 自動清理: 通過 SingletonManager 統(tǒng)一管理,避免內存泄漏;
  • 靈活構造: 支持帶參數(shù)構造(完美轉發(fā)),適配復雜單例類;
  • 安全易用: 提供斷言校驗、宏定義快捷訪問,降低使用成本;
  • 可擴展: 支持手動銷毀、優(yōu)先級清理、線程局部單例等進階需求。

該框架可直接用于 Qt 控制臺程序、桌面程序(QWidget)、移動程序(Qt Quick)等所有場景,是 Qt 開發(fā)中單例模式的優(yōu)選實現(xiàn)方案。

以上就是Qt優(yōu)雅實現(xiàn)線程安全單例模式(模板化和自動清理)的詳細內容,更多關于Qt線程單例模式的資料請關注腳本之家其它相關文章!

相關文章

  • C語言數(shù)據(jù)的存儲專項分析

    C語言數(shù)據(jù)的存儲專項分析

    使用編程語言進行編程時,需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內存位置。這意味著,當您創(chuàng)建一個變量時,就會在內存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內存和決定在保留內存中存儲什么
    2022-07-07
  • C語言運用函數(shù)指針數(shù)組實現(xiàn)計算器功能

    C語言運用函數(shù)指針數(shù)組實現(xiàn)計算器功能

    這篇文章主要為大家詳細介紹了C語言運用函數(shù)指針數(shù)組實現(xiàn)計算器功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C/C++利用篩選法算素數(shù)的方法示例

    C/C++利用篩選法算素數(shù)的方法示例

    這篇文章主要給大家介紹了關于利用C/C++篩選法算素數(shù)的相關資料,文中給大家列舉了普通枚舉法和篩選法兩種方法實現(xiàn)的方法示例,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧。
    2017-12-12
  • OpenCV透視變換應用之書本視圖矯正+廣告屏幕切換

    OpenCV透視變換應用之書本視圖矯正+廣告屏幕切換

    透視變換是指利用透視中心、像點、目標點三點共線的條件,按透視旋轉定律使承影面繞跡線旋轉某一角度,破壞原有的投影光線束,仍能保持承影面上投影幾何圖形不變的變換。本文將為大家介紹兩個OpenCV透視變換應用,需要的可以參考一下
    2022-08-08
  • 詳解C語言中的字符串數(shù)組

    詳解C語言中的字符串數(shù)組

    這篇文章主要介紹了C語言中的字符串數(shù)組,本文通過示例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • C語言簡明清晰講解枚舉

    C語言簡明清晰講解枚舉

    枚舉法的本質就是從所有候選答案中去搜索正確的解,枚舉算法簡單粗暴,他暴力的枚舉所有可能,盡可能地嘗試所有的方法,感興趣的朋友來看看吧
    2022-05-05
  • 基于C語言打造高效通訊錄的示例代碼

    基于C語言打造高效通訊錄的示例代碼

    本文主要介紹了如何使用C語言實現(xiàn)一個通訊錄。實現(xiàn)通訊錄的過程中,會大量用到C語言的知識點,包括但不限于:函數(shù)、自定義類型、指針、動態(tài)內存管理、文件操作,感興趣的可以了解一下
    2023-05-05
  • C++輕量級UI庫DuiLib使用指南與優(yōu)劣詳解

    C++輕量級UI庫DuiLib使用指南與優(yōu)劣詳解

    DuiLib(及其增強版DuiLib_Ultimate)是專為Windows優(yōu)化的輕量級UI庫,具有界面靈活、自定義性強等特點,本文給大家介紹C++輕量級UI庫DuiLib使用指南與優(yōu)劣解析,感興趣的朋友跟隨小編一起看看吧
    2026-05-05
  • C語言輪轉數(shù)組的三種實現(xiàn)

    C語言輪轉數(shù)組的三種實現(xiàn)

    輪轉數(shù)組是一種將數(shù)組元素循環(huán)移動的處理方式,它通常用于解決一些需要對固定長度的數(shù)組進行循環(huán)滾動處理的問題,本文就介紹了C語言輪轉數(shù)組的三種實現(xiàn),感興趣的可以了解一下
    2023-08-08
  • C++編譯期字符串處理方法

    C++編譯期字符串處理方法

    這篇文章給大家介紹了C++編譯期字符串處理方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2026-03-03

最新評論

宣威市| 枞阳县| 象山县| 清镇市| 珠海市| 裕民县| 始兴县| 孟州市| 门源| 河津市| 崇明县| 太谷县| 琼结县| 涪陵区| 磐安县| 瑞昌市| 白银市| 洛宁县| 顺义区| 朝阳市| 丹棱县| 呼和浩特市| 济阳县| 高陵县| 长顺县| 邯郸市| 垦利县| 丹巴县| 三江| 丹阳市| 新宁县| 察雅县| 崇礼县| 淮滨县| 青川县| 贞丰县| 化德县| 霍邱县| 葫芦岛市| 台前县| 上栗县|