Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C++] vectors multidimensionali

    Buongiorno a tutti.
    Ho la necessità di creare dei vector di interi di due dimensioni.
    L'output finale dovrebbe essere qualcosa del tipo
    3
    0 1 2
    3
    1 2
    Conosco il numero delle righe dell'output ma non la loro lunghezza.
    Ho usato la seguente sintassi
    vector< vector<int> > best_reply;
    ora, riesco ad "riempire" il mio vector di vector creando un vector di interi ausiliare, modificandolo e poi aggiungendolo quindi:
    vector<int> aux;
    ...
    rimpio il mio vettore
    ..
    best_reply.push_back(aux);

    ora, i problemi nascono quando voglio stampare o scorrere tutta la mia matrice, le cui righe hanno una lunghezza che non conosco a priori:
    io avrei fatto un ciclo del tipo

    for(i=0;i<numero_di_righe;i++)
    {
    for(j=0;j<best_reply[i].size();j++)
    {
    cout<<best_reply[i][j];
    }
    }

    Al mio compilatore la cosa non piace, ho cercato in altri forum ma ottenuto risposte strane: è vero che tutti i vector nella matrice devono avere lo stesso numero di righe? Ma se devo obbligatoriamente fissare la dimensione del mio vector, che vantaggio ho ad usarlo? Potrei usare un semplice array e sovrastimare in modo bovaro le dimensioni, ma non mi sembra una soluzione troppo elegante...
    Grazie mille

  2. #2
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    potresti usare un'altra struttura dati più adatta a ciò che vuoi fare come il map o il multimap

  3. #3
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Al "compilatore non piace" è un'indicazione inutile. Che errore hai di preciso?
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  4. #4
    l'errore è il seguente
    [numero della riga] error: `class std:: vector<int, std::allocator<int>> ´ has no member named `size´
    che vuole poi dire che sto facendo una boiata scrivendo
    best_reply[i].size()
    ma non ho capito perchè è una boiata (best_reply[i] è lui stesso un vector, perchè non posso usare la funzione size()?) e come fare a risolverla. Ho provato con gli iteratori ma non sono proprio brava ed alla fine mi è sembrato che non ci si capisse più nulla (il codice deve essere più o meno leggibile anche per chi non usa il c++ perchè il mio capo non sa programmare ma vuole controllare, per ci quando possibile lascio perdere iteratori e puntatori)
    grazie mille

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Quel codice comunque è corretto; size() fa parte dell'interfaccia del vector (e non solo) quindi ci deve essere. Che compilatore usi? Hai prefissato std::davanti le dichiarazioni?
    L'errore potrebbe essere prima.

    In ogni caso puoi prendere spunto da qui per scrivere la tua matrice.
    http://www.emagsoftware.it/faqcpp.htm#9
    se scorri la pagina, poco sotto ci sono esempi col vector e fanno più o meno quello che fai tu.

    è vero che tutti i vector nella matrice devono avere lo stesso numero di righe?
    Secondo me è necessaria una distinzione.
    Non so per definizione o altro, ma in genere per matrice si intende un rettangolo X * Y di elementi. Quindi la risposta alla domanda è: si.
    Però, nulla vieta di avere un vettore di vettori le cui righe sono variabili (come quello che vorresti, se non ho capito male) e il modo per scorrerlo (non sapendo a priori la lunghezza delle singole righe) è quello che hai postato (che a me funziona, da li la domanda del compilatore).
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  6. #6
    Un esempio di "vettore" con righe di lunghezza diversa:
    codice:
    #include <iostream>
    #include <vector>
    #include <limits>
    #include <sstream>
    
    using namespace std;
    
    template<class inType> void AcquireInput(ostream & Os, istream & Is, const string & Prompt, inType & Result)
    {
        do
        {
            Os<<Prompt.c_str();
            if(Is.fail())
            {
                Is.clear();
                Is.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
            }
            Is>>Result;
        } while(Is.fail());
    }
    
    template<class inType> inType AcquireInput(ostream & Os, istream & Is, const string & Prompt)
    {
        inType temp;
        AcquireInput(Os,Is,Prompt,temp);
        return temp;
    }
    
    int main()
    {
        bool endVector=false;
        vector< vector<int> > vect;
        cout<<"Inserisci 0 per terminare la riga o qualunque numero negativo per terminare il vettore"<<endl;
        for(int row=0;!endVector;row++)
        {
            vect.push_back(vector<int>());
            cout<<endl;
            for(int column=0;;column++)
            {
                ostringstream os;
                int value;
                os<<'['<<row<<','<<column<<']';
                value=AcquireInput<int>(cout,cin,os.str());
                if(value==0)
                    break;
                else if(value<0)
                {
                    endVector=true;
                    if(vect.back().size()==0)
                        vect.pop_back();
                    break;
                }
                else
                    vect.back().push_back(value);
            }
        }
        cout<<"Stampa contenuto vettore"<<endl;
        for(size_t row=0;row<vect.size();row++)
        {
            for(size_t column=0;column<vect[row].size();column++)
            {
                cout<<vect[row][column]<<' ';
            }
            cout<<endl;
        }
        return 0;
    }
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.