2011-01-06 16 views
2

Es gibt ein Problem in meinem Code mit verschachtelten Vektoren von Strings. Es druckt die Zeichenfolgen nicht.Traversing verschachtelte Vektoren von Strings

void foo(vector<vector<char const *> > const & vcp){ 
    vector<vector<char const *> >::const_iterator i(vcp.begin()); 
    vector<vector<char const *> >::const_iterator e(vcp.end()); 

    for(; i != e; ++i){ 
     vector<char const *>::const_iterator ci(i->begin()); 
     vector<char const *>::const_iterator ce(i->end()); 
     for(; ci != ce; ++ci) 
     cout<<*ci<<endl; //Not printing 
    } 
} 

int main(){ 
    std::vector<vector<char const *> > vvcp(3); 
    std::vector<char const *> vcp(3); 
    vcp.push_back(string("abcd").c_str()); 
    vcp.push_back(string("efgh").c_str()); 
    vcp.push_back(string("ijkl").c_str()); 

    vvcp.push_back(vcp); 
    vvcp.push_back(vcp); 
    foo(vvcp); 
    return EXIT_SUCCESS; 
} 

Antwort

6

Das hat nichts mit den Vektoren zu tun.

Sie erstellen temporärestd::string Objekte, Zeiger auf die zugrunde liegenden Daten zu erhalten, und versuchen, diese Zeiger zu verwenden, nachdem die Saiten nicht mehr existieren. Das ist nicht erlaubt.

(auch Fütterung '* x' std :: cout, wobei 'x' ein char const * ist, würde nur das erste Zeichen des C-String drucken.)

speichern Sie einfach die Saiten in die Vektoren. So sollst du sie benutzen. .c_str() existiert wirklich nur, so dass Sie mit altem C-Code arbeiten können.

+0

Großartig! Vielen Dank. – badmaash

1

Ich bestätige @Karl. Ändern Sie Ihren Code in C-Stil:

vcp.push_back("abcd"); 
vcp.push_back("efgh"); 
vcp.push_back("ijkl");