標籤:
說來慚愧,一道簡單的對vector遞迴的題目寫了一個多小時,最後還是請教了大神才改出來。
首先貼上原代碼:
void return_vector(vector<int>::iterator,vector<int>);int main(){ int n, temp; vector<int> symbol{}; cin >> n; for (int i = 0; i < n; ++i) { cin >> temp; symbol.push_back(temp); } return_vector(symbol.end(), symbol); system("pause"); return 0;}void return_vector(vector<int>::iterator ptr,vector<int> a){ if (ptr != a.begin()) return_vector(ptr - 1, a); cout << *ptr << endl;}
結果提示錯誤:vector iterators incompatible!
然後調試了一下,用非遞迴形式類比這個過程:
for (auto i = symbol.end();i != symbol.begin(); i = i - 1) cout << *i << endl;
依然提示該錯誤,調試發現是對end()函數理解有誤,C++Primer中寫到:end()返回vector最後一個元素的下一個位置。
改之:
for (auto i = symbol.end()-1;i != symbol.begin(); i = i - 1) cout << *i << endl;
測試通過!
改正之前代碼,運行,依然報同一個錯誤。
繼續調試,發現是在
if (ptr != a.begin()) return_vector(ptr - 1, a);
這一句中的!=出現錯誤(F11跟到了!=的重載的位置),但不知道具體哪兒出錯。
大神幫我看了下變數的地址,發現a.begin()和ptr的指向的地址不相同,遂想到是否因為是傳入的是形參,導致函數中的vector<int> a 和main中定義的 vector<int> symbol並不是同一個vector,而a是symbol的一個拷貝?
於是將函數改成傳入symbol的引用:
void return_vector(vector<int>::iterator,vector<int>&);int main(){ int n, temp; vector<int> symbol{}; cin >> n; for (int i = 0; i < n; ++i) { cin >> temp; symbol.push_back(temp); } return_vector(symbol.end() - 1, symbol); //for (auto i = symbol.end()-1;i != symbol.begin(); i = i - 1) // cout << *i << endl; system("pause"); return 0;}void return_vector(vector<int>::iterator ptr,vector<int>& a){ if (ptr != a.begin()) return_vector(ptr - 1, a); cout << *ptr << endl;}
測試,通過!
總結:
1.在對傳入的vector或者數組等參數沒有改變的時候,最好使用引用,這樣一些指標依然存在意義,而且不容易出錯。
2.end()函數指向的是容器的最後一個元素的下一個位置,切不可直接對XXX.end()直接解引用。
3.由是想到函數參數的一些問題:何時傳入引用,何時傳入指標?二者的優劣(如果有的話)?什麼時候應該使用const,什麼時候不行?這些都還需要細細理解。
vector的坑——C++primer練習6.33總結