//  remove0.cpp - Erase all the zero elements in a vector
//                ILLUSTRATION OF WHAT DOES NOT WORK !!!

#include <vector>
#include <iostream>
using namespace std;

void showVec(const vector<int> &v) {

  cout << "\n  ";
  int i;
  for(i=0; i<v.size()-1; i++)
    cout << v[i] << ", ";
  cout << v[v.size()-1] << "\n\n";

}

void main() {

  vector<int> 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<int>::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 <vector>
#include <iostream>
using namespace std;

void showVec(const vector<int> &v) {

  cout << "\n  ";
  int i;
  for(i=0; i<v.size()-1; i++)
    cout << v[i] << ", ";
  cout << v[v.size()-1] << "\n\n";

}

void main() {

  vector<int> 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<int>::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 <vector>
#include <iostream>
using namespace std;

void showVec(const vector<int> &v) {

  cout << "\n  ";
  int i;
  for(i=0; i<v.size()-1; i++)
    cout << v[i] << ", ";
  cout << v[v.size()-1] << "\n\n";

}

void main() {

  vector<int> 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<int>::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 <vector>
#include <iostream>
using namespace std;

void showVec(const vector<int> &v) {

  cout << "\n  ";
  int i;
  for(i=0; i<v.size()-1; i++)
    cout << v[i] << ", ";
  cout << v[v.size()-1] << "\n\n";

}

void main() {

  vector<int> 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<int>::iterator dest = v.begin();
  vector<int>::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 <vector>
#include <algorithm>
#include <iostream>
using namespace std;

void showVec(const vector<int> &v) {

  cout << "\n  ";
  int i;
  for(i=0; i<v.size()-1; i++)
    cout << v[i] << ", ";
  cout << v[v.size()-1] << "\n\n";

}

void main() {

  vector<int> 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<int>::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

