J_lle Skrevet 8. september 2005 Del Skrevet 8. september 2005 (endret) #include <algorithm> #include <vector> #include <map> #include <string> using namespace std; bool space(const char c) { return isspace(c); } bool not_space(const char c) { return !isspace(c); } void split(const string& str, map<string, string>& data) { typedef map<string, string>::const_iterator iter; iter it_1 = data.begin(); iter it_2 = find_if(it_1, data.end(), space); iter it_3 = find_if(it_2, data.end(), not_space); iter it_4 = find_if(it_3, data.end(), space); data.insert(make_pair(string(it_1, it_2), string(it_3, it_4))); return; } void split(const string& str, vector<string>& data) { typedef vector<string>::const_iterator iter; iter it_1 = data.begin(); iter it_2 = find_if(it_1, data.end(), space); data.push_back(string(it_1, it_2)); return; } Når jeg prøver å kompilere får jeg masse feilmeldinger.. Det jeg forstår er at kompilereren finner ikke find_if() funksjonen.. In function `void split(const std::string&, std::map<std::string, std::string, std::less<std::string>, std::allocator<std::pair<const std::string, std::string> > >&)': 35 no matching function for call to `find_if(split(const std::string&, std::map<std::string, std::string, std::less<std::string>, std::allocator<std::pair<const std::string, std::string> > >&)::iter&, std::_Rb_tree_iterator<std::pair<const std::string, std::string> >, bool (&)(char))' 305 C:\Dev-Cpp\include\c++\3.4.2\bits\basic_string.h no matching function for call to `std::char_traits<char>::assign(char&, const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)' og masse sånne fra basic_string.h.. Og jeg aner ikke hva det er... EDIT: pynte litt og fjerne litt.. Endret 8. september 2005 av J_lle Lenke til kommentar
Mr.Garibaldi Skrevet 9. september 2005 Del Skrevet 9. september 2005 (endret) Prøv med #inlclude <basic_string.h> i stedet for de andre #include du bruker. #include skal peke til header filen som inneholder deklarasjoner av metoder mm., og ikke til navnene på metodene mm... (Dog kan man lage header filer uten å kalle dem .h på slutten, men tror ikke det er tilfellet her...) EDIT: Og basic_string.h er en av to filer du skulle fått fra stedet du leser koden fra (hjemmeside til bok, e.l.). Disse må du plassere riktig i forhold til path, evt. spesifisere hvor ligger når du kompilerer. Det følger som regel med instruksjoner for hva du skal gjøre når du laster ned filene) Endret 9. september 2005 av Mr.Garibaldi Lenke til kommentar
J_lle Skrevet 9. september 2005 Forfatter Del Skrevet 9. september 2005 (endret) Og basic_string.h er en av to filer du skulle fått fra stedet du leser koden fra (hjemmeside til bok, e.l.). Disse må du plassere riktig i forhold til path, evt. spesifisere hvor ligger når du kompilerer. Det følger som regel med instruksjoner for hva du skal gjøre når du laster ned filene) Skjønner ikke helt hva du mener.. Når jeg bruker basic_string.h får jeg bare enda flere feil.. Men jeg skjønner heller ikke greia med find_if() funksjonen.. Siden jeg har inkludert 'algorithm' hvor find_if skal være deklarert.. Her er feilmeldinga.. skjønner ikke noe som helst av den.. Endret 9. september 2005 av J_lle Lenke til kommentar
kjetil7 Skrevet 10. september 2005 Del Skrevet 10. september 2005 (endret) Nei, du skal aldri inkludere basic_string.h. Du skal bruke <string>. std::string er bare en typedef for std::basic_string<char> og vil automatisk være tilgjengelig etter du inkluderer <string>. Jeg vil også tro at det faktisk er implementasjonsavhengig om det i det hele tatt eksisterer en basic_string.h . Ved første øyekast ser du ut som du har en del logiske feil i tillegg til rene syntaksfeil. Kan du kanskje prøve å fortelle hva du prøver å få til før jeg graver dypere ned? Men find_if fungerer utmerket i hvertfall: typedef std::vector<char> my_vector_type; void split(const my_vector_type & data) { my_vector_type::const_iterator itbeg = data.begin(); my_vector_type::const_iterator itres = std::find_if(itbeg, data.end(), isspace); // ... } void split(my_vector_type & data) { my_vector_type::iterator itbeg = data.begin(); my_vector_type::iterator itres = std::find_if(itbeg, data.end(), isspace); // ... } Du klarer kanskje å trekke noen slutninger fra dette selv. Legg merke til hvordan const brukes og prøv gjerne å bytte ut std::vector<char> med std::vector<string>... Endret 10. september 2005 av kjetil7 Lenke til kommentar
Mr.Garibaldi Skrevet 10. september 2005 Del Skrevet 10. september 2005 Nei, du skal aldri inkludere basic_string.h. Du skal bruke <string>. std::string er bare en typedef for std::basic_string<char> og vil automatisk være tilgjengelig etter du inkluderer <string>. Jeg vil også tro at det faktisk er implementasjonsavhengig om det i det hele tatt eksisterer en basic_string.h . Ah, my bad. Har aldri fått den feilmeldingen, så jeg tenkte ikke over at det kunne være en "underdel" av string.h Takk for info Lenke til kommentar
Peter Skrevet 10. september 2005 Del Skrevet 10. september 2005 string (<string>), ikke string.h Lenke til kommentar
J_lle Skrevet 14. september 2005 Forfatter Del Skrevet 14. september 2005 Har ikke vært helt i god form i det siste så jeg har ikke fått svart her.. Jeg har en tekst fil med kategori og ord (i den rekkefølgen) og jeg vil dele opp de.. Jeg bruker derfor getline(ifstream, str) og sender str (som da er en std::string) til splitfunksjonen sammen med vector eller map.. Splitfunksjonen som tar vector skal bare ta kategorien og returnere mens map skal ta begge (kategori som first og ordet som second).. Lenke til kommentar
kjetil7 Skrevet 15. september 2005 Del Skrevet 15. september 2005 (endret) Da skal du søke i str og ikke containeren du skal lagre resultatet til. Nå kjører du find_if på vector og map containerne. Du kan bruke find_first_of eller lignende medlemsfunksjon av std::string. Du finner beskrivelse av std::string (som er en typedef av std::basic_string<char>) her: http://msdn.microsoft.com/library/default....ing_members.asp Edit: Her er et lite eksempel for å hjelpe deg litt på vei... : void split(const std::string & str, std::vector<std::string> data) { std::string::size_type pos = str.find_first_of(' '); if(pos != std::string::npos) { data.push_back(str.substr(0, pos)); } else { // str har ikke mellomrom i seg... } } Det skal ikke være så vanskelig å modifisere denne funksjonen til å fungere med std::map. Endret 15. september 2005 av kjetil7 Lenke til kommentar
J_lle Skrevet 15. september 2005 Forfatter Del Skrevet 15. september 2005 Takker.. Skal prøve på denne måten i stedet.. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå