vector中的刪除,erase和remove的小疑惑--【STL】
阿新 • • 發佈:2018-12-30
對於vector容器的使用,平時只是簡單的進行遍歷查詢一下,未曾進行其它操作,這不,今天出了一點差錯;
erase方法的操作是將此時的節點刪除,然後指向被刪除節點的下一個:
如對資料1 6 6 4 7;
進行如上操作的結果為:#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { vector<int> vec; vec.push_back(1); vec.push_back(6); vec.push_back(6); vec.push_back(4); vec.push_back(7); vector<int>::iterator arr; //vec.erase(remove(vec.begin(), vec.end(), 6), vec.end()); for(arr = vec.begin(); arr != vec.end(); arr++) { if(6 == *arr) { vec.erase(arr); //arr--; } } cout << "The size of vector is :" << vec.size() << endl; for(arr = vec.begin(); arr != vec.end(); arr++) { cout << *arr << " "; } cout << endl; return 0; }
有一個6未成功刪除,由於每次迴圈後都將迭代器arr++,在成功刪除之後節點後移了一位,實際上在刪除進行時是後移了兩位,故而在刪除時:
for(arr = vec.begin(); arr != vec.end(); arr++)
{
if(6 == *arr)
{
vec.erase(arr);
arr--;
}
}
有了arr--操作,就可抵消刪除時的自動後移,從而成功進行:
當然,erase還有另外一個方法,就是刪除兩個節點之間的全部元素,這時依靠remove操作將等於刪除值的節點全部移到容器末尾,進行刪除;
將上述for迴圈刪除的註釋,將其上一行的vec.erase(remove(vec.begin(), vec.end(), 6), vec.end());註釋取消即可實現;
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { vector<int> vec; vec.push_back(1); vec.push_back(6); vec.push_back(6); vec.push_back(4); vec.push_back(7); vector<int>::iterator arr; vec.erase(remove(vec.begin(), vec.end(), 6), vec.end()); // /*for(arr = vec.begin(); arr != vec.end(); arr++) { if(6 == *arr) { vec.erase(arr); arr--; } }*/ cout << "The size of vector is :" << vec.size() << endl; for(arr = vec.begin(); arr != vec.end(); arr++) { cout << *arr << " "; } cout << endl; return 0; }
O(∩_∩)O