Qt QVector詳解

一、QVector簡介

Qt QVector是一個動態數組模板類。它類似於C++ STL vector,但是具有更高的效率和更低的空間佔用率。QVector在內部使用一個指向數組以及數組容量和大小的指針來表示動態數組。當數組存儲容量不足時,QVector會自動擴展容量以便更多的數據。

二、QVector的基本操作

1. QVector的創建

創建QVector的最簡單的方法是使用默認構造函數:

QVector<int> vector1; //創建一個空的整數數組

也可以使用列表初始化:

QVector<QString> vector2 {"Apple", "Banana", "Cherry"};

2. QVector的插入與刪除

可以使用append()和prepend()在數組開頭或結尾插入元素。還有insert()可以在數組中插入元素:

QVector<int> vector {1, 2, 3};
vector.append(4); //在末尾插入4
vector.prepend(0); //在頭部插入0
vector.insert(2, 10); //在第3個位置插入值為10的元素

通過remove()可以刪除數組中的元素:

vector.remove(1); //刪除第2個元素
vector.removeFirst(); //刪除第1個元素
vector.removeLast(); //刪除最後一個元素

3. QVector的訪問

QVector支持通過下標訪問元素,也可以使用at()方法以及迭代器iterator來訪問元素。vector.first()和vector.last()可以分別返回數組的第一個和最後一個元素。

QVector<QString> vector {"Apple", "Banana", "Cherry"};
QString item1 = vector[0]; //訪問第一個元素
QString item2 = vector.at(1); //訪問第二個元素
for (auto i = vector.constBegin(); i != vector.constEnd(); ++i) {
    //使用const迭代器訪問整數數組
    cout << *i << endl;
}

4. QVector的遍歷

QVector可以使用迭代器iterator進行遍歷。您還可以使用foreach循環來遍曆數組:

QVector<int> vector {1, 2, 3, 4, 5};
foreach(int item, vector) { //使用foreach遍曆數組
    cout << item << endl;
}

三、QVector高級操作

1. QVector的排序

QVector支持使用qSort()方法進行排序,也可以使用STL的std::sort()來進行排序:

QVector<int> vector {3, 1, 4, 2, 5};
qSort(vector); //排序vector
for (int i = 0; i < vector.size(); ++i) {
    cout << vector[i] << endl;
}

2. QVector的拷貝

QVector支持使用copy()或operator=()方法創建數組的淺拷貝和深拷貝:

QVector<int> vector {1, 2, 3};
QVector<int> vector2 = vector; //使用operator=()方法進行深拷貝
QVector<int> vector3 = vector2.copy(); //使用copy()方法進行淺拷貝

3. QVector的容量調整

QVector會自動調整容量以便更多的數據,但是在某些情況下可能需要手動調整容量。可以使用reserve()方法來分配數組的存儲空間:

QVector<int> vector;
vector.reserve(1000); //分配存儲空間以容納至少1000個元素

4. QVector的異常處理

QVector檢查越界錯誤,並在發生錯誤時調用qFatal()方法結束程序。您可以通過設置全局QT_NO_EXCEPTIONS宏來禁用異常處理機制。同時還可以使用at()方法而不是使用下標來訪問元素,以避免越界。此外,還可以使用value()方法來訪問特定位置的元素,如果索引越界,則返回默認值:

QVector<int> vector {1, 2, 3};
try {
    int item = vector.at(4); //訪問越界元素時拋出一個異常
} catch (const std::out_of_range& e) {
    //越界異常
    cout << e.what() << endl;
}
int defaultValue = -1;
int item2 = vector.value(4, defaultValue); //使用默認值來訪問第5個元素

四、QVector實例代碼

#include <QCoreApplication>
#include <QDebug>
#include <QVector>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    //創建一個空的字符串數組
    QVector<QString> vector1;

    //將字符串插入到數組中
    vector1.append("Apple");
    vector1.append("Banana");
    vector1.append("Cherry");

    //遍曆數組
    foreach(QString fruit, vector1) {
        qDebug() << fruit;
    }

    //在數組中查找酸奶的索引
    if (vector1.contains("Yogurt")) {
        qDebug() << "Found Yogurt!";
    } else {
        qDebug() << "Did not find Yogurt!";
    }

    //創建一個整型數組
    QVector<int> vector2;

    //將整數插入到數組中
    vector2.append(1);
    vector2.append(2);
    vector2.append(3);
    vector2.append(4);
    vector2.append(5);

    //獲取數組的第二個元素(下標為1)
    int secondItem = vector2.at(1);

    //遍曆數組並求和
    int sum = 0;
    foreach(int number, vector2) {
        sum += number;
    }

    //排序數組
    qSort(vector2);

    //輸出數組的所有元素
    for (int i = 0; i < vector2.size(); ++i) {
        qDebug() << vector2[i];
    }

    return a.exec();
}

原創文章,作者:HLWCL,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/332170.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
HLWCL的頭像HLWCL
上一篇 2025-01-21 17:30
下一篇 2025-01-21 17:30

相關推薦

  • Qt雷達探測教程

    本文主要介紹如何使用Qt開發雷達探測程序,並展示一個簡單的雷達探測示例。 一、環境準備 在開始本教程之前,需要確保你的開發環境已經安裝Qt和Qt Creator。如果沒有安裝,可以…

    編程 2025-04-29
  • Qt State Machine與狀態機模式

    本文將介紹Qt State Machine和狀態機模式在Qt中的實現。Qt提供了QStateMachine和QState兩個類,可以方便地實現狀態機模式,並且能有效地處理複雜的、多…

    編程 2025-04-27
  • Python中的Qt庫

    Qt庫是一個跨平台的C++圖形用戶界面(GUI)工具包。它提供了豐富的界面控件和處理系統事件的功能,可以輕鬆創建交互界面、圖形化應用和多媒體應用。而Python中的Qt庫則是Qt的…

    編程 2025-04-27
  • xmake qt:構建Qt應用的全流程解決方案

    本文將會詳細闡述xmake qt的使用方法以及其能夠解決的問題。針對Qt應用開發中的各種困境,xmake提供了一整套的解決方案,包括自動構建、依賴管理、部署打包等,極大地提高了開發…

    編程 2025-04-27
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • C語言貪吃蛇詳解

    一、數據結構和算法 C語言貪吃蛇主要運用了以下數據結構和算法: 1. 鏈表 typedef struct body { int x; int y; struct body *nex…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web服務器。nginx是一個高性能的反向代理web服務器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性傳感器,能夠同時測量加速度和角速度。它由三個傳感器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25

發表回復

登錄後才能評論