vector subscript out of range

來源:互聯網
上載者:User

當初寫日誌,只是為了記錄一下自己所做的事情,沒想到會有別人來看。所以沒有任何的解釋,只是胡亂寫了些東西。


其實問題很簡單,題目已經說明一切,錯誤就是越界,仔細檢查代碼,找出什麼地方可能會越界就行了

昨天運行程式時,突然出現了如題所述的錯誤。錯誤很明顯,vector的下標越界了,但是之前一直沒有什麼問題啊,於是我仔細讀代碼,debug,然後拿出前天能啟動並執行程式,依然會出現這個錯誤。

開始時不甘心,一直想著昨天之前都能運行,錯誤應該出在昨天的代碼裡面。

於是找啊找,找了一天終於還是沒有找到。

今天繼續找,不過今天已經不找昨天寫的代碼了,開始看看裡面調用的之前的函數,結果很短時間就找出來了,一個很低級的手誤。。。

 

總結:不能太相信自己,適當相信這些“標準”,畢竟是這麼多人總結出來,被更多的人用,提示這個錯誤就先找找這種錯誤

要更加仔細

要學會debug,寫完代碼多運行幾遍

 

另外,明白了vector裡面的at & [],源碼如下:


const_reference at(size_type _Pos) const<br />{// subscript nonmutable sequence with checking<br />if (size() <= _Pos)<br />_Xran();<br />return (*(begin() + _Pos));<br />}<br />reference at(size_type _Pos)<br />{// subscript mutable sequence with checking<br />if (size() <= _Pos)<br />_Xran();<br />return (*(begin() + _Pos));<br />}<br />const_reference operator[](size_type _Pos) const<br />{// subscript nonmutable sequence<br /> #if _HAS_ITERATOR_DEBUGGING<br />if (size() <= _Pos)<br />{<br />_DEBUG_ERROR("vector subscript out of range");<br />_SCL_SECURE_OUT_OF_RANGE;<br />}<br /> #endif /* _HAS_ITERATOR_DEBUGGING */<br />_SCL_SECURE_VALIDATE_RANGE(_Pos < size());<br />return (*(_Myfirst + _Pos));<br />}<br />reference operator[](size_type _Pos)<br />{// subscript mutable sequence<br /> #if _HAS_ITERATOR_DEBUGGING<br />if (size() <= _Pos)<br />{<br />_DEBUG_ERROR("vector subscript out of range");<br />_SCL_SECURE_OUT_OF_RANGE;<br />}<br /> #endif /* _HAS_ITERATOR_DEBUGGING */<br />_SCL_SECURE_VALIDATE_RANGE(_Pos < size());<br />return (*(_Myfirst + _Pos));<br />} 

The difference between this member function and member operator function operator[] is that vector::at signals if the requested position is out of range by throwing an out_of_range exception. operator [] signals only if _HAS_ITERATOR_DEBUGGING.雖然不是太明白,但是應該是at()會檢查越界,而[]除了在這種debug時,是不會查越界的。所以我以後還是用.at()吧。不過 這樣會降低效率,還是[]在實際中應該會好些。一是簡單可讀,二是只在調試的時候查越界,調試完使用時不檢查,節約時間。不過好像c++ 0x會兩個都檢查了。不清楚,等待新標準

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.