2013-10-14 1 views
0

Je ne parviens pas sortir mon vecteur de listes:un vecteur de Restitution des listes en C++

class index_table { 

public: 
    index_table() { table.resize(128);} 
    void insert(string &, int); 

private: 
    class entry 
    { 
     public: 
     string word; 
     vector <int> line; 
    }; 

    vector< list <entry> > table; 
}; 

Je l'ai pour qu'il remplira:

int main() 
{ 
index_table table; 
string word, 
int num = 5; //this is going to a random number. 5 is a temp. place holder. 

while (cin >> word) 
    table.insert(word, num); 

} 

mais comment pour le sortir? J'ai essayé beaucoup d'approches différentes, mais beaucoup d'entre elles me donnent des erreurs.
Dois-je surcharger l'opérateur? Je ne suis pas tout à fait sûr de savoir comment je serai capable de le faire.

Répondre

3

En supposant que vous avez vraiment une bonne raison d'utiliser std::vector< std::list<entry> >, alors sur la structure donnée, l'impression des mots pourrait ressembler à ceci:

class index_table { 
public: 
    void print() { 
     for (size_t i = 0; i < table.size(); ++i) { 
      std::list<entry>::iterator li; 
      for (li = table[i].begin(); li != table[i].end(); ++li) 
       std::cout << li->word << " "; 
     } 
    } 
    ... 

private: 
    std::vector< std::list<entry> > table; 
    ... 
}; 
1

Si votre compilateur prend en charge 11 C++, vous pouvez utiliser deux plage basée imbriquée pour les boucles. Regardez dans la fonction void index_table::dump().

// Output function 
void index_table::dump() { 
    for (list<entry> &le : table) { 
     for (entry &e : le) { 
      e.dump(); 
     } 
    } 
} 

J'ai aussi créé une fonction dump() dans la classe d'entrée, qui délivre le contenu de deux variables, qui est maintenant privatisé.

class index_table { 
    public: 
    index_table() { 
     table.resize(128); 
    } 

    void insert (int,string&,int); 
    void dump(); 

    private: 
    class entry { 
     private: 
     string word; 
     int value; 

     public: 
     entry (string word, int value) { 
      this->word = word; 
      this->value = value; 
     } 

     void dump() { 
      cout << "Word/value is: " << word << "/" << value << endl; 
     } 
    }; 

    vector< list <entry> > table; 
}; 

void index_table::insert(int c, string &key, int value) { 
//void index_table::insert(string &key, int value) { 
    entry obj(key, value); 

    table[c].push_back(obj); 
} 

// Output function 
void index_table::dump() { 
    for (list<entry> &le : table) { 
     for (entry &e : le) { 
      e.dump(); 
     } 
    } 
} 

int main (int argc, char **argv) { 
    index_table mytable; 

    string a = "String 0-A"; 
    string b = "String 0-B"; 
    string c = "String 1-A"; 
    string d = "String 1-B"; 
    string e = "String 6-A"; 
    string f = "String 6-B"; 

    mytable.insert(0, a, 1); 
    mytable.insert(0, b, 2); 
    mytable.insert(1, c, 3); 
    mytable.insert(1, d, 4); 
    mytable.insert(6, e, 3); 
    mytable.insert(6, f, 4); 

    mytable.dump(); 
} 

sorties du programme:

Word/value is: String 0-A/1 
Word/value is: String 0-B/2 
Word/value is: String 1-A/3 
Word/value is: String 1-B/4 
Word/value is: String 6-A/3 
Word/value is: String 6-B/4 

PS: J'ai aussi changé votre code un peu pour le faire fonctionner plus facilement pour mon test.