Domanda problema vector in un loop

Stato
Discussione chiusa ad ulteriori risposte.

xDevily

Utente Emerald
9 Agosto 2012
925
101
183
528
Buongiorno, sto cercando di realizzare una specie di calcolatrice e ho un problema nell usare una lista di oggetti (vector<Ogg> Oggetti) in un loop;

La classe Ogg:

Codice:
class Ogg
{
  public:
     float valore = 0;
     char tipo = 'n';
};


Per ora ho scritto questa funzione che quando viene chiamata fa bloccare il programma con l' errore: "vector iterator not incrementable". Qualcuno sarebbe cosi gentile a dirmi dove sbaglio visto che e' un po' che non riesco a risolvere questo problema?

Codice:
void FindPriorityOperations()
{
    int i = 0;

    for each  (Ogg o in Oggetti)
    {


        if (o.tipo == '*' || o.tipo == '/')
        {
            cout << i << " " << o.tipo;
            float result;

            switch (o.tipo)
            {
                case '*':
                    result = Oggetti[i - 1].valore * Oggetti[i+1].valore;
                    break;
                case '/':
                    result = Oggetti[i - 1].valore / Oggetti[i + 1].valore;
                    break;

                default:
                    cout << "FindPriorityOperations(): Segno sbagliato!"<<endl;
                    break;
            }


            Ogg temp;
            temp.tipo = '+';
            Oggetti.push_back(temp); // aggiunge un piu in coda

            temp.tipo = 'f';
            temp.valore = result;
            Oggetti.push_back(temp);  // aggiunge in risultato in coda

            auto min = Oggetti.begin() + i - 1;
            auto max = Oggetti.begin() + i + 1;

            Oggetti.erase(min, max); // elimina gli oggetti usati


        }

        i++;

    }

Se non si fosse capito il linguaggio e' C++
 
for each (Ogg o in Oggetti)
Non è C++, scrivi for (auto &o : Oggetti)
Comunque è difficile aiutarti con solo questo pezzetto di codice, se non ti funziona cerca far apparire quell'errore in qualcosa di compilabile.

Comunque non è proprio un design pulitissimo quello che stai usando, generalmente non si dovrebbe modificare (tu gli aggiungi elementi) ciò che si itera. Valuta l'idea di reimplementarlo in modo diverso.
 
  • Mi piace
Reazioni: xDevily
Ultima modifica:
Non è C++, scrivi for (auto &o : Oggetti)
Comunque è difficile aiutarti con solo questo pezzetto di codice, se non ti funziona cerca far apparire quell'errore in qualcosa di compilabile.

Comunque non è proprio un design pulitissimo quello che stai usando, generalmente non si dovrebbe modificare (tu gli aggiungi elementi) ciò che si itera. Valuta l'idea di reimplementarlo in modo diverso.

Ho capito dove sbagliavo e ho riscritto parte della funzione, dai test che ho fatto fino ad ora sembra che vada tutto bene.

Codice:
void FindPriorityOperations()
{
   int i = 0;
   vector<int> posizioni;
   vector<float> risultati;

   for (auto &o : Oggetti)
   {


     if (o.tipo == '*' || o.tipo == '/')
     {
       float result;

       switch (o.tipo)
       {
         case '*':
           result = Oggetti[i - 1].valore * Oggetti[i+1].valore;
           break;
         case '/':
           result = Oggetti[i - 1].valore / Oggetti[i + 1].valore;
           break;

        default:
           cout << "FindPriorityOperations(): Segno sbagliato!"<<endl;
          break;
       }

       posizioni.push_back(i);
       risultati.push_back(result);

     }

     i++;

   }

   i = 0;
  

   for (int j : posizioni)
   {


     cout << "Pos: "<<j  <<" Risultato: "<< risultati [i]<< endl;
     Ogg temp;
     temp.tipo = Oggetti[j-2].tipo;
     Oggetti.push_back(temp); // aggiunge un piu in coda

     temp.tipo = 'f';
     temp.valore = risultati[i];
     Oggetti.push_back(temp);  // aggiunge in risultato in coda


     for (int k = j - 2; k < j + 2; k++)
     {
       Oggetti[k].tipo = 'u';
     }

     i++;

   }

   for (vector<Ogg>::iterator k = Oggetti.begin(); k != Oggetti.end();)
   {
     if (k->tipo == 'u')
     {
       k = Oggetti.erase(k);
     }
     else
       k++;
   }
  
}
 
Stato
Discussione chiusa ad ulteriori risposte.