// remove0.cpp - Erase all the zero elements in a vector // ILLUSTRATION OF WHAT DOES NOT WORK !!! #include #include using namespace std; void showVec(const vector &v) { cout << "\n "; int i; for(i=0; i v; v.push_back(5); v.push_back(1); v.push_back(0); v.push_back(-1); v.push_back(0); v.push_back(3); v.push_back(0); v.push_back(0); v.push_back(-4); v.push_back(0); showVec(v); cout << "v.size() = " << v.size() << '\n'; cout << "v.max_size() = " << v.max_size() << '\n'; vector::iterator it; for(it=v.begin(); it!=v.end(); it++) if(*it == 0) v.erase(it); // error here because first // erase invalidates iterator showVec(v); } // remove1.cpp - Erase all the zero elements in a vector // ILLUSTRATION OF WHAT DOES NOT WORK !!! #include #include using namespace std; void showVec(const vector &v) { cout << "\n "; int i; for(i=0; i v; v.push_back(5); v.push_back(1); v.push_back(0); v.push_back(-1); v.push_back(0); v.push_back(3); v.push_back(0); v.push_back(0); v.push_back(-4); v.push_back(0); showVec(v); vector::iterator it, tempIt; for(it=v.begin(); it!=v.end(); it++) { tempIt = it; if(*tempIt == 0) v.erase(tempIt); // error here because erase invalidates } // every iterator into the vector showVec(v); } // remove2.cpp - Erase all the zero elements in a vector. // This works, but would not be very // efficient for large vectors. #include #include using namespace std; void showVec(const vector &v) { cout << "\n "; int i; for(i=0; i v; v.push_back(5); v.push_back(1); v.push_back(0); v.push_back(-1); v.push_back(0); v.push_back(3); v.push_back(0); v.push_back(0); v.push_back(-4); v.push_back(0); showVec(v); vector::iterator it = v.begin(); while(it!=v.end()) if(*it==0) it = v.erase(it); else ++it; showVec(v); } 5, 1, 0, -1, 0, 3, 0, 0, -4, 0 5, 1, -1, 3, -4 // remove3.cpp - Erase all the zero elements in a vector. // This is an effective method. It is // exactly what remove does. #include #include using namespace std; void showVec(const vector &v) { cout << "\n "; int i; for(i=0; i v; v.push_back(5); v.push_back(1); v.push_back(0); v.push_back(-1); v.push_back(0); v.push_back(3); v.push_back(0); v.push_back(0); v.push_back(-4); v.push_back(0); showVec(v); vector::iterator dest = v.begin(); vector::iterator src; for(src=v.begin(); src!=v.end(); src++) if(*src != 0) *dest++ = *src; v.erase(dest,v.end()); showVec(v); } 5, 1, 0, -1, 0, 3, 0, 0, -4, 0 5, 1, -1, 3, -4 // remove4.cpp - Erase all the zero elements in a vector. // This is an effective method. #include #include #include using namespace std; void showVec(const vector &v) { cout << "\n "; int i; for(i=0; i v; v.push_back(5); v.push_back(1); v.push_back(0); v.push_back(-1); v.push_back(0); v.push_back(3); v.push_back(0); v.push_back(0); v.push_back(-4); v.push_back(0); showVec(v); vector::iterator new_end; new_end = remove(v.begin(),v.end(),0); v.erase(new_end,v.end()); showVec(v); } 5, 1, 0, -1, 0, 3, 0, 0, -4, 0 5, 1, -1, 3, -4