首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ vector 建構子深度解析:迭代器範圍初始化與指標、陣列的關係

     編輯:程式設計疑難解答

現象

代碼片段:

int ia[] = {0,1,2,3,4,5,6,7};
std::vector v5(ia, ia+8); // 括號裡放陣列名/指標

疑問:`vector` 建構子括號裡放的是陣列名 `ia` 和 `ia+8`,這是指標嗎?代表什麼意思?

標準答案:這是「迭代器範圍建構子」

std::vector 提供建構子模板:

template 
vector(InputIterator first, InputIterator last);

功能:複製範圍 [first, last)(包含 first,不包含 last)內的所有元素到 vector。

為什麼陣列名 `ia` 能當迭代器?

  • 陣列名在表達式中會隱式轉換為「指向首元素的指標」(`int*`),即 `&ia[0]`。
  • 原始指標滿足 LegacyInputIterator 概念:支援 `*` 解引用、`++` 遞增、`==` 比較。
  • 因此 ia 相當於 `ia[0]` 的地址,ia+8 相當於 `ia[8]` 的地址(尾後位置)。

記憶體圖示

ia:  [0][1][2][3][4][5][6][7]
      ↑                 ↑
     ia (first)       ia+8 (last)
     
vector v5 複製得到:{0,1,2,3,4,5,6,7}

關鍵區別:陣列 ≠ 指標

特性陣列 int ia[8]指標 int* p
型別int[8]int*
`sizeof`整個陣列大小 (32 bytes)指標大小 (4/8 bytes)
可修改性不可修改(非左值)可修改指向
隱式轉換大多數情境轉為 `int*`本身即指標

結論:此處 `ia` **表現為**指向首元素的指標,**本質上**是陣列。C++ 標準庫設計利用指標作為最基礎的迭代器,實現了對 C 風格陣列的無縫支援。

現代 C++ 更推薦寫法

// C++11 起,使用 std::begin/end 更安全、可讀、支援所有容器
std::vector v5(std::begin(ia), std::end(ia));

// 或範圍建構子 (C++23 提案中,目前可用範圍構造)
std::vector v5(ia, ia + std::size(ia)); // 需 

總結

  1. `vector(ia, ia+8)` 調用**迭代器範圍建構子**,複製 [ia, ia+8) 區間元素。
  2. 陣列名 `ia` 退化為指標,指標滿足迭代器要求,故可直接使用。
  3. 這是 C++ 標準庫「泛型編程」設計精髓:算法/容器只認迭代器概念,原始指標、陣列、容器迭代器統統通用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved