Boost Spirit, phrase_parse() mit std::vector<std::string>::const_iterator
-
Hallo,
ich habe einen Parser mit Boost Spirit geschrieben der Teile einer Datei parst (nicht die ganze Datei da das Dateiformat zu umfangreich ist).
Ich lese nur Teile der Datei ein die ich parsen moechte, das mache ich so in etwa :std::string = ""; while(file.good()) { std::getline(file,line); if(line.find("..."))str+=line; }Das ganze ist natuerlich total imperformant da ich immer wieder an str anhaenge. Jetzt moechte ich die Teile der Datei nicht in in einem std::string speichern sondern in einem std::vector :
std::vector<std::string>vec; while(file.good()) { std::getline(file,line); if(line.find("..."))vec.push_back(line); }Wie kann ich jetzt den vector Boost spirit parse_phrase zum parsen uebergeben? In der Doku steht das Boost Spirit phrase_parse einen ForwardIterator erwartet, ich versuche phrase_parse wie folgt auzurufen:
std::vector<std::string>vec; while(file.good()) { std::getline(file,line); if(line.find("..."))vec.push_back(line); } boost::spirit::qi::phrase_parse(vec.cbegin(),vec.cend(),parser,skip,st))Jetzt bekomme ich aber die Compilerfehlermeldung:
0: '<function-style-cast>' : cannot convert from 'std::basic_string<_Elem,_Traits,_Ax>' to 'char'Was mache ich falsch?
Besten Dank
-
Als erstes:
while(file.good())Das ist eine ganz blöde und unidiomatische Schleifenbedingung.
Besser:std::string line; // War wohl so gemeint, die Definition while( std::getline(file,line) ) if( line.find("...") ) str += line;Zu deinem eigentlichen Problem: Ich rate, dass
parse_phraseIteratoren auf Zeichen (vom Typchar) erwartet, nicht auf Strings.Das ganze ist natuerlich total imperformant da ich immer wieder an str anhaenge.
Nö, das ganze ist nicht unperformant. Nicht wenn du vorher Speicher reservierst, dann ist das nur eine Kopie.
str.reserve( /* Eine Zahl die in etwa abschätzt wie viel Zeichen du lesen wirst */ );Und danach kannst du dann
shrink_to_fitaufrufen.
-
Wie soll ich das vorher abschaetzen koennen? Manchmal ist die Datei nur einige Kilobyte gross und ein anderes mal ueber 30 Megabyte.