vector的坑——C++primer練習6.33總結

來源:互聯網
上載者:User

標籤:

  說來慚愧,一道簡單的對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總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.