C++ operacje na liczbach

0

Witam wszystkich jak widać mam fajny programik, który działa dobrze ale nie do końca. Program ma wcześniej wczytane liczby posortować wyświetlić i usunąć powtarzające się liczby. Nie wiem dlaczego ale moja pętla for z funkcją erase zamiast usuwać powtarzający się element usuwa mi co drugi. Czy ktoś może mi pomóc, jak zmieniam sobie chociaż troszke pętle albo iterator to wszystko mi pada.

To mój kod:

#include <cstdlib>
#include <iostream>
#include <vector>
#include <list>
#include<algorithm>
using namespace std;
class wypisz{
public:
     void operator()(const int& v){
	  cout<<"liczby:"<<v<<endl;
     }
};
int main(int argc, char *argv[]){
     vector<int> v;
     int i;
     while(true) {
	  cout<<"Podaj liczbe :"<<endl;
	  cin>>i;
	  v.push_back(i);
	  char c='n';
	  cout<<"Czy chcesz dalej wprowadzac TAK/NIE"<<endl;
	  cin>>c;
	  if(c=='n') break;
     } 
     cout<<"sortowanie"<<endl;
     sort(v.rbegin(),v.rend());
     cout<<endl<<"po sortowaniu:"<<endl;
     for_each(v.begin(),v.end(),wypisz());
     for (vector<int>::iterator i=v.begin();i<v.end();++i){
	  if (i==i){   //<b>tutaj mam problem</b>
	       v.erase(i);              
	  }                                          
     }
     cout<<endl<<"po usunieciu elementu"<<endl;

     for_each(v.begin(),v.end(),wypisz());
     system("PAUSE");
     return EXIT_SUCCESS;
}
0

Jestem raczej początkujący tak więc za bardzo mną się nie sugeruj, ale mam takie pytanie
co oznacza

if (i==i){}

bo według mnie to raczej dziwny warunek. Znaczy wykona się jak i będzie równe i :-/ (czyli chyba łatwiej napisac:

for (vector<int>::iterator i=v.begin();i<v.end();++i)
{
          v.erase(i);                                                                  
}
0

właśnie to i==i jest bez sensu, to będzie zawsze spełnione...

powinieneś zrobić jeszcze jedna pętlę, która będzie sprawdzać kolejne wartości coś takiego:

for(vector<int> i=v.begin();i<=v.end();i++)
  for(vector<int> j=i+1;j<=v.end();j++)
    if(*i  == *j) //jeśli wartości(nie iteratory, wartości vectora)
      v.erase(j);
0

raczej mniej\więcej tak na oko:

     for (vector<int>::iterator i = v.begin();i < --v.end();)
	  *i == *(i+1) ? i = v.erase(i) : i++;

@crayze, wektor jest posortowany, to raz, dwa - j po usunięciu staje się nieważny - otrzymasz piękny segfault.

hm, znów cuda z serwerem... na szybko skleciłem nieco inną wersję tego programu:

#include <vector>
#include <iostream>
#include <sstream>
#include <iterator>
#include <algorithm>

using namespace std;

int main() {
     typedef int iType;
     vector<iType> v;

     cout << "Podaj liczby: ";
     stringstream sstream;
     cin.get(*sstream.rdbuf());
     copy(istream_iterator<iType>(sstream), istream_iterator<iType>(), back_inserter(v)); 

     sort(v.rbegin(), v.rend());

     cout << endl << "po posortowaniu /malejaco/:" << endl;
     copy(v.begin(), v.end(), ostream_iterator<iType>(cout, " "));

     v.resize(unique(v.begin(), v.end()) - v.begin());

     cout << endl << "po usunieciu powtorzen:" << endl;
     copy(v.begin(), v.end(), ostream_iterator<iType>(cout, " "));
     cout << endl;

     cin.ignore().get();
     return 0;
}

...literówek w stringach kompilator sprawdzać niestety nie sprawdza :/

1 użytkowników online, w tym zalogowanych: 0, gości: 1