Toon posts:

[C++] string iterator en map<string, string>

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik zit ontzettend te prutsen met een string iterator en het lukt me maar niet om iets werkends te krijgen. Ik heb een map<string, string> stringMap en een string x. Nou wil ik iets van:

code:
1
2
3
4
5
6
7
8
9
10
11
12
map<string, string> stringMap;
string x = "abcdefg";
string y = "";
string::iterator iterator;
for (iterator = x.begin(); iterator != x.end(); iterator++) {
    if (*iterator == '(') {
        // blablabla
    }
    else if (stringMap[*iterator] != "") {
        y += stringMap[*iterator];
    }
}


Bij die "else if" gaat het dus fout: ik krijg een foutmelding "error: initializing argument 1 of ‘std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std:: allocator<char>]’". Dat zal wel iets betekenen maar ik snap het niet. Als ik de dubbele aanhalingstekens vervang door enkele ('') wordt het "error: empty character constant".

Op de regel na de else if ("y += ..") krijg ik als melding "error: invalid conversion from ‘const char’ to ‘const char*’".

Als ik iets doe van
code:
1
if (stringMap["A"] != "") {

gaat het wel goed, dus ik denk dat die iterator geen string teruggeeft ofzo. Maar eigenlijk snap ik er gewoon helemaal niks van en internet maakt me ook niks wijzer, het enige wat ze daar met de iterator doen is 'm naar cout gooien. Kan iemand me uitleggen wat er nou mis gaat?

[ Voor 7% gewijzigd door Verwijderd op 18-02-2007 20:23 ]


  • DroogKloot
  • Registratie: Februari 2001
  • Niet online

DroogKloot

depenisvanjezus

*iterator is een char, geen string. Je map gebruikt echter strings als keys, geen chars.

Verwijderd

Topicstarter
Tnx! Ik snap niet waarom een iterator over een string geen strings teruggeeft, maar goed, ik ben weer wat verder :)

Verwijderd

De elementen van een string zijn characters. Je itereert over deze elementen, characters dus. Overigens lijk je het eerder in de code wel te snappen, want daar vergelijk je *iterator met de constante '(' van type character...

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je moet je trouwens beseffen dat
C++:
1
else if (stringMap[*iterator] != "") {

Altijd een entry aan zal maken als deze nog niet bestaat. Je test 'm met een lege string, wat idd true is als de entry nog niet bestaat (want dan wordt er een als lege string aangemaakt), maar zo langzamerhand ben je je map dus wel met nutteloze entries aan het vullen.

Om te kijken of een entry er in zit gebruik je find() of count():
C++:
1
2
3
4
5
6
if (stringMap.find("hoi") == stringMap.end())
    std::cout << "bestaat niet" << std::endl;

// of
if (stringMap.count("hoi") == 0)
   // etc.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Aha, dank je! Zo zie je maar, je moet tutorials op 't internet niet zomaar vertrouwen! :)
Pagina: 1