在<<c++ primer>> 第四版Exercise Section 4.3.1 練習題中的Exercise 4.28 題,如下:
編寫程序由標准輸入的元素數據建立一個int 型的vector 對象,然后動態創建一個與該vector 對象大小一致的數組,把vector 中的元素全部都復制到新數組。代碼示例如下:
1 // 2_3.cpp : 定義控制台應用程序的入口點。 2 // 3 4 #include "stdafx.h" 5 #include <iostream> 6 #include <string> 7 #include <vector> 8 9 using namespace std; 10 11 int main() 12 { 13 14 vector<int> vect; 15 int num; 16 while (cin >> num) 17 { 18 if (num == 0) 19 { 20 break; 21 } 22 vect.push_back(num); 23 } 24 int *ptr = new int[vect.size()]; 25 int i = 0; 26 for (vector<int>::iterator begin = vect.begin(); begin != vect.end(); ++begin, ++ptr) 27 { 28 *ptr = *begin; 29 } 30 31 ptr = ptr - vect.size(); 32 33 for (size_t i = 0; i < vect.size(); i++) 34 { 35 cout << *(ptr + i) << endl; 36 } 37 38 delete[] ptr; 39 return 0; 40 }
測試環境本機windows 10,vs2015.這里有一點要說明,
第26-29 行是遍歷vector 對象並將該對象中的數值全部都通過數組指針的解引用放到數組中來。
第33-36 行是遍歷數組,通過數組指針的解引用來取值,將值全部打印出來。
特別要說明的是,第31行代碼非常重要,因此在26行的循環跑完以后,數組指針已經指導數組最后的位置了,如果31行不把數組指針退回到起點位置,那么會導致33行的循環出現數組越界的錯誤。導致程序報錯。測試了很久才發現這個問題,特別記錄一下。