2013-10-14 3 views
0

У меня возникли проблемы выводящий мой вектор списков:Выведение вектор списков в 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; 
}; 

Я получил его, так что он будет заполняться:

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); 

} 

но как вывести его? Я пробовал много разных подходов, но многие из них дают мне ошибки.
Должен ли я перегружать оператора? Я не совсем уверен, как смогу это сделать.

ответ

3

Предполагая, что у вас действительно есть веские причины для использования std::vector< std::list<entry> >, а затем на основе данной структуры, печать слов может выглядеть следующим образом:

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

Если ваш компилятор поддерживает C++ 11, вы можете использовать два на основе основанных на петлях. Посмотрите в функции void index_table::dump().

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

Я также создал функцию dump() в классе входа, который выводит содержимое двух переменных, которые теперь сделаны частными.

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(); 
} 

выходы программы:

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: Я также изменил код немного, чтобы сделать его работать более легко для моего теста.

Смежные вопросы