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

C++動態(tài)數(shù)組兩種實現(xiàn)方式詳解(std::vector vs malloc)

 更新時間:2026年01月07日 09:58:58   作者:司徒軒宇  
在C++中動態(tài)數(shù)組是處理可變大小數(shù)據(jù)集合的常見需求,本文將詳細介紹兩種主要的實現(xiàn)方式,使用C++標準庫的std::vector和使用C風(fēng)格的malloc,下面就來詳細的介紹一下,感興趣的可以了解一下

在C++中,動態(tài)數(shù)組是處理可變大小數(shù)據(jù)集合的常見需求。本文將詳細介紹兩種主要的實現(xiàn)方式:使用C++標準庫的std::vector和使用C風(fēng)格的malloc,并對比它們的差異、使用方法以及最佳實踐。

1. std::vector:現(xiàn)代C++的推薦方式

1.1 基本語法與參數(shù)

// 基本語法
std::vector<T> name(size);

// 實際示例
std::vector<uint8_t> occlusions(points_cnt);

參數(shù)詳解:

  • 模板參數(shù) T:指定向量中元素的類型,這里是uint8_t(無符號8位整數(shù),通常就是unsigned char
  • 構(gòu)造函數(shù)參數(shù) size:指定向量初始的大小,這里是points_cnt(必須是整數(shù)類型)
  • 向量名稱 occlusions:變量名,遵循C++命名規(guī)則

1.2 如何訪問和操作元素

訪問單個元素:

// 使用下標運算符(不進行邊界檢查)
occlusions[0] = 255;           // 設(shè)置第一個元素
uint8_t value = occlusions[0]; // 獲取第一個元素

// 使用at()方法(進行邊界檢查,安全但稍慢)
occlusions.at(0) = 255;        // 如果索引越界會拋出std::out_of_range異常
uint8_t value = occlusions.at(0);

// 使用迭代器
auto it = occlusions.begin();  // 獲取起始迭代器
*it = 255;                     // 通過迭代器訪問元素

遍歷所有元素:

// 方法1:使用下標循環(huán)
for (size_t i = 0; i < occlusions.size(); ++i) {
    occlusions[i] = i % 256;  // 賦值
    std::cout << (int)occlusions[i] << " ";  // 訪問
}

// 方法2:使用范圍for循環(huán)(C++11起)
for (uint8_t& val : occlusions) {
    val = 128;  // 可以直接修改
}

// 方法3:使用迭代器
for (auto it = occlusions.begin(); it != occlusions.end(); ++it) {
    *it = 64;
}

1.3 完整示例

#include <iostream>
#include <vector>
#include <cstdint>

void vectorExample() {
    size_t points_cnt = 10;
    
    // 創(chuàng)建并初始化向量
    std::vector<uint8_t> occlusions(points_cnt, 0);  // 所有元素初始化為0
    
    // 修改元素
    for (size_t i = 0; i < points_cnt; ++i) {
        occlusions[i] = static_cast<uint8_t>(i * 25);
    }
    
    // 添加新元素
    occlusions.push_back(255);  // 自動調(diào)整大小
    occlusions.emplace_back(128);  // C++11:原地構(gòu)造
    
    // 讀取并顯示所有元素
    std::cout << "Vector contents: ";
    for (const auto& val : occlusions) {
        std::cout << (int)val << " ";
    }
    std::cout << std::endl;
    
    // 獲取向量信息
    std::cout << "Size: " << occlusions.size() << std::endl;
    std::cout << "Capacity: " << occlusions.capacity() << std::endl;
    
    // 注意:不需要手動釋放內(nèi)存!
    // 當occlusions離開作用域時,vector會自動清理
}

2. malloc:C風(fēng)格的動態(tài)內(nèi)存分配

2.1 基本語法與參數(shù)

// 基本語法
T* name = (T*)malloc(count * sizeof(T));

// 實際示例
unsigned char* occlusions = (unsigned char*)malloc(points_cnt * sizeof(unsigned char));

參數(shù)詳解:

  • malloc函數(shù)參數(shù):需要分配的字節(jié)數(shù) = points_cnt * sizeof(unsigned char)
  • 返回值類型轉(zhuǎn)換malloc返回void*,需要強制轉(zhuǎn)換為目標指針類型
  • 指針變量 occlusions:指向分配內(nèi)存起始地址的指針

2.2 如何訪問和操作元素

訪問單個元素:

// 使用數(shù)組下標語法
occlusions[0] = 255;           // 設(shè)置第一個元素
unsigned char value = occlusions[0];  // 獲取第一個元素

// 使用指針算術(shù)
*(occlusions) = 255;           // 等價于occlusions[0] = 255
*(occlusions + 1) = 128;       // 等價于occlusions[1] = 128
unsigned char value = *(occlusions + 2);  // 等價于occlusions[2]

遍歷所有元素:

// 使用指針遍歷
unsigned char* ptr = occlusions;
for (size_t i = 0; i < points_cnt; ++i) {
    *ptr = static_cast<unsigned char>(i * 25);
    ++ptr;  // 移動指針
}

// 使用下標遍歷
for (size_t i = 0; i < points_cnt; ++i) {
    occlusions[i] = i % 256;
}

2.3 完整示例

#include <iostream>
#include <cstdlib>  // malloc, free
#include <cstring>  // memset

void mallocExample() {
    size_t points_cnt = 10;
    
    // 分配內(nèi)存
    unsigned char* occlusions = 
        (unsigned char*)malloc(points_cnt * sizeof(unsigned char));
    
    // 重要:檢查分配是否成功
    if (occlusions == nullptr) {
        std::cerr << "Memory allocation failed!" << std::endl;
        return;
    }
    
    // 重要:初始化內(nèi)存(malloc不初始化內(nèi)存?。?
    memset(occlusions, 0, points_cnt * sizeof(unsigned char));
    
    // 填充數(shù)據(jù)
    for (size_t i = 0; i < points_cnt; ++i) {
        occlusions[i] = static_cast<unsigned char>(i * 25);
    }
    
    // 顯示內(nèi)容
    std::cout << "Malloc array contents: ";
    for (size_t i = 0; i < points_cnt; ++i) {
        std::cout << (int)occlusions[i] << " ";
    }
    std::cout << std::endl;
    
    // 重要:必須手動釋放內(nèi)存!
    free(occlusions);
    occlusions = nullptr;  // 避免野指針
}

3. 詳細對比與選擇指南

3.1 內(nèi)存管理對比

特性std::vectormalloc/free
初始化默認初始化元素不初始化,內(nèi)容是隨機的
內(nèi)存釋放自動(RAII)必須手動調(diào)用free()
異常安全是,構(gòu)造函數(shù)失敗會拋出異常否,需要檢查返回值
重新分配自動(resize/push_back)需要realloc(),數(shù)據(jù)可能被移動

3.2 性能與安全對比

// std::vector的安全性示例
void safeVectorExample() {
    std::vector<uint8_t> vec(10);
    
    try {
        vec.at(20) = 100;  // 拋出std::out_of_range異常
    } catch (const std::out_of_range& e) {
        std::cout << "安全地捕獲了越界訪問: " << e.what() << std::endl;
    }
    
    // vec[20] = 100;  // 未定義行為,可能崩潰或數(shù)據(jù)損壞
}

// malloc的不安全性示例
void unsafeMallocExample() {
    unsigned char* arr = (unsigned char*)malloc(10);
    
    // 常見錯誤1:忘記檢查分配是否成功
    if (arr == nullptr) { /* 必須檢查! */ }
    
    // 常見錯誤2:忘記初始化
    // arr[0]可能是任意值!
    
    // 常見錯誤3:越界訪問
    arr[15] = 100;  // 未定義行為,可能破壞其他內(nèi)存
    
    // 常見錯誤4:忘記釋放內(nèi)存(內(nèi)存泄漏)
    // free(arr);  // 如果忘記這行,內(nèi)存泄漏!
}

4. 高級用法與技巧

4.1 std::vector的高級特性

void advancedVectorUsage() {
    // 多種初始化方式
    std::vector<uint8_t> v1(10, 0xFF);           // 10個元素,每個都是0xFF
    std::vector<uint8_t> v2 = {0, 1, 2, 3, 4};  // 初始化列表(C++11)
    std::vector<uint8_t> v3(v1);                // 拷貝構(gòu)造
    
    // 內(nèi)存預(yù)分配
    v1.reserve(1000);  // 預(yù)分配內(nèi)存,避免多次重新分配
    
    // 安全訪問
    if (!v1.empty()) {
        uint8_t first = v1.front();  // 第一個元素
        uint8_t last = v1.back();    // 最后一個元素
    }
    
    // 范圍操作
    v1.insert(v1.begin(), {10, 20, 30});  // 開頭插入多個元素
    v1.erase(v1.begin() + 1, v1.begin() + 3);  // 刪除第2-3個元素
    
    // C++17:并行算法支持
    std::sort(std::execution::par, v1.begin(), v1.end());
}

4.2 malloc的高級用法與陷阱

void advancedMallocUsage() {
    size_t count = 10;
    
    // 正確:使用calloc自動初始化為0
    unsigned char* arr1 = (unsigned char*)malloc(count * sizeof(unsigned char));
    // arr1的所有元素都是0
    
    // 正確:使用realloc調(diào)整大小
    arr1 = (unsigned char*)realloc(arr1, count * 2);
    // 注意:realloc可能移動內(nèi)存,原有指針失效
    
    // 陷阱:錯誤的大小計算
    // 錯誤:可能溢出
    size_t large = 1000000000;
    // unsigned char* bad = malloc(large * large);  // 溢出!
    
    // 正確:檢查溢出
    if (large > SIZE_MAX / sizeof(unsigned char)) {
        // 處理溢出錯誤
    }
    
    // 釋放內(nèi)存
    free(arr1);
}

到此這篇關(guān)于C++動態(tài)數(shù)組兩種實現(xiàn)方式詳解(std::vector vs malloc)的文章就介紹到這了,更多相關(guān)C++動態(tài)數(shù)組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++實現(xiàn)簡易UDP網(wǎng)絡(luò)聊天室

    C++實現(xiàn)簡易UDP網(wǎng)絡(luò)聊天室

    這篇文章主要為大家詳細介紹了C++實現(xiàn)簡易UDP網(wǎng)絡(luò)聊天室,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • c/c++實現(xiàn)獲取域名的IP地址

    c/c++實現(xiàn)獲取域名的IP地址

    本文給大家匯總介紹了使用c/c++實現(xiàn)獲取域名的IP地址的幾種方法以及這些方法的核心函數(shù)gethostbyname的詳細用法,非常的實用,有需要的小伙伴可以參考下。
    2015-11-11
  • C語言排序算法之冒泡排序?qū)崿F(xiàn)方法【改進版】

    C語言排序算法之冒泡排序?qū)崿F(xiàn)方法【改進版】

    這篇文章主要介紹了C語言排序算法之冒泡排序?qū)崿F(xiàn)方法,結(jié)合具體實例形式分析了C語言實現(xiàn)的基本冒泡排序?qū)崿F(xiàn)方法及增設(shè)flag標志位的改進型算法,需要的朋友可以參考下
    2017-09-09
  • C++數(shù)據(jù)結(jié)構(gòu)的隊列詳解

    C++數(shù)據(jù)結(jié)構(gòu)的隊列詳解

    這篇文章主要為大家介紹了C++數(shù)據(jù)結(jié)構(gòu)的隊列,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • C++ 再識類和對象

    C++ 再識類和對象

    類是創(chuàng)建對象的模板,一個類可以創(chuàng)建多個對象,每個對象都是類類型的一個變量;創(chuàng)建對象的過程也叫類的實例化。每個對象都是類的一個具體實例(Instance),擁有類的成員變量和成員函數(shù)
    2021-10-10
  • C++ 中類的拷貝、賦值、銷毀的實例詳解

    C++ 中類的拷貝、賦值、銷毀的實例詳解

    這篇文章主要介紹了C++ 中類的拷貝、賦值、銷毀的實例詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • 舉例講解C語言的fork()函數(shù)創(chuàng)建子進程的用法

    舉例講解C語言的fork()函數(shù)創(chuàng)建子進程的用法

    fork函數(shù)是Linux下一個近乎專有的C語言函數(shù),因為使用時需要調(diào)用unistd.h這個頭文件,這里我們就在Linux環(huán)境下舉例講解C語言的fork()函數(shù)創(chuàng)建子進程的用法,需要的朋友可以參考下
    2016-06-06
  • 簡要對比C語言中的truncate()函數(shù)與ftruncate()函數(shù)

    簡要對比C語言中的truncate()函數(shù)與ftruncate()函數(shù)

    這篇文章主要介紹了C語言中的truncate()函數(shù)與ftruncate()函數(shù)的簡要對比,注意其之間的區(qū)別,需要的朋友可以參考下
    2015-09-09
  • C語言設(shè)計實現(xiàn)掃描器的自動機的示例詳解

    C語言設(shè)計實現(xiàn)掃描器的自動機的示例詳解

    這篇文章主要為大家詳細介紹了如何利用C語言設(shè)計實現(xiàn)掃描器的自動機,可識別的單詞包括:關(guān)鍵字、界符、標識符和常整型數(shù),感興趣的小伙伴可以了解一下
    2022-12-12
  • C++中關(guān)于多態(tài)實現(xiàn)和使用方法

    C++中關(guān)于多態(tài)實現(xiàn)和使用方法

    這篇文章主要介紹了C++中關(guān)于多態(tài)實現(xiàn)和使用方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07

最新評論

青铜峡市| 沽源县| 武陟县| 马边| 马公市| 阿拉善左旗| 合川市| 泸州市| 横峰县| 安国市| 伊春市| 临海市| 嘉定区| 玉林市| 乡城县| 和平县| 赤城县| 平阳县| 二连浩特市| 武川县| 台北市| 泸水县| 商南县| 南京市| 宜都市| 健康| 鱼台县| 锦屏县| 栖霞市| 阜阳市| 广丰县| 万安县| 黄浦区| 循化| 西华县| 湟中县| 民权县| 兴山县| 惠安县| 包头市| 白河县|