Gå til innhold

find_if() error og noe med basic_string.h


Anbefalte innlegg

#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...

:nei:

 

EDIT: pynte litt og fjerne litt..

Endret av J_lle
Lenke til kommentar
Videoannonse
Annonse

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 av Mr.Garibaldi
Lenke til kommentar
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 av J_lle
Lenke til kommentar

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 av kjetil7
Lenke til kommentar
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

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

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 av kjetil7
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...