由於最近項目使用中發現了之前對vector的一個誤區,由此發現自己對vect非常不了解,對此進行了一些了解,由此打算寫一下關於
vector使用方面的注意點,本篇先來講一下vector的erase功能,若有不對,盡請大家指出
首先寫了一個函數,用於打印vector內存情況,分別打印vector存儲數據內容及內存地址:
void printVec(vector<int> outputVec) { if (!outputVec.empty()) { int nSize = outputVec.size(); for (int i = 0; i < nSize; i++) { printf_s("%d %d\r\n", outputVec.at(i), &(outputVec.at(i))); } } cin.get(); }
然後我們開始測試vector的erase功能
我們先申請一個vector對象,並向其中壓入10個數據
vector<int> myVec; cout<<"push_back VEC"<<endl; for (int i = 0; i <10; i++) { myVec.push_back(i); } printVec(myVec);
再將其按照錯誤的方式刪除,也就是我之前使用的方式
vector<int>::iterator itePre; cout<<"erase VEC in wrong way"<<endl; for (itePre = myVec.begin(); itePre != myVec.end(); itePre++) { myVec.erase(itePre); } printVec(myVec);
按我以前的理解,這樣的循環刪除方式預期的結果應該是會把vector中的數據清空,但是事實並非如此
事實會導致程序崩潰
因為itePre迭代器本身在被erase之後,是不可預測的,不應該再次被使用。
為此我修改了代碼如下:
vector<int>::iterator itePre; cout<<"erase VEC in wrong way"<<endl; for (itePre = myVec.begin(); itePre != myVec.end(); itePre++) { itePre = myVec.erase(itePre); } printVec(myVec);
得出的結果也並不是我想要的清空所有數據
而是只刪除了一半的數據,為什麼呢?
因為在MSDN中,針對erase的返回值是這麼描述的:
An iterator that designates the first element remaining beyond any elements removed, or a pointer to the end of the vector if no such element exists.
也就是說erase的返回值是返回被刪除元素向後的第一個元素,按照我的代碼,在刪除元素後的第一個元素下我又++了,那麼就跳過了那一個元素,自然結果就不是我想要的。
因此我再次修改代碼如下:
myVec.clear(); cout<<"push_back VEC again"<<endl; for (int i = 0; i <10; i++) { myVec.push_back(i); } printVec(myVec); cout<<"erase VEC in right way"<<endl; for (itePre = myVec.begin(); itePre != myVec.end();) { itePre = myVec.erase(itePre); } printVec(myVec);
此次得到了我想要的結果: