Tarvitsen harjoitustyössäni seuraavanlaista luokkaa:
class Pala { typedef map<string, Pala> palamappi; public: void tallenna_pala (deque<string> syotteen_tiedot); void tulosta_pala (deque<string> syotteen_tiedot, palamappi palamappi); void kaanna_pala (); void tulosta_rinnakkain (); private: deque<unsigned int> palan_luvut; deque<string> palan_merkit; };
Lisäksi tarvitsen map-rakennetta, jossa hakuavaimena on palan nimi ja datatyyppinä luokka Pala:
map<string, Pala> palamappi;
Nyt haluaisin tulostaa mapista haluamani palan. Ongelma on se, että en tiedä miten oikea notaatio tulisi kirjoittaa Olen yrittänyt seuraavaa:
void Pala::tulosta_pala(deque<string> syotteen_tiedot, palamappi palamappi) { string palan_nimi = syotteen_tiedot.at(1); palamappi::iterator it = palamappi.find(syotteen_tiedot.at(1)); cout << "("; for (deque<unsigned int>::iterator luku_it = it -> second.palan_luvut.begin(); luku_it != palan_luvut.end(); luku_it++) { cout << *luku_it << " "; } cout << '\b' << ")" << endl; //deque<string>::iterator luku_it = it -> second; for (deque<string>::iterator merkki_it = it -> second.palan_merkit.begin(); merkki_it != palan_merkit.end(); merkki_it++) { cout << *merkki_it << endl; } // deque<string>::iterator merkki_it }
Menee kääntäjästä läpi, mutta ajaessa saan virheilmoituksen:
/usr/local/gcc/gcc-4.8.1/include/c++/4.8.1/debug/safe_iterator.h:542:error: attempt to compare iterators from different sequences. Objects involved in the operation: iterator "lhs" @ 0x0xbfd2954c { type = N11__gnu_debug14_Safe_iteratorINSt9__cxx199815_Deque_iteratorIjRjPjEENSt7__debug5dequeIjSaIjEEEEE (mutable iterator); state = dereferenceable (start-of-sequence); references sequence with type `NSt7__debug5dequeIjSaIjEEE' @ 0x0xbfd2954c } iterator "rhs" @ 0x0xbfd295b0 { type = N11__gnu_debug14_Safe_iteratorINSt9__cxx199815_Deque_iteratorIjRjPjEENSt7__debug5dequeIjSaIjEEEEE (mutable iterator); state = past-the-end; references sequence with type `NSt7__debug5dequeIjSaIjEEE' @ 0x0xbfd295b0 } (Aborted
Eli kuinka saan haluamani hakutiedon kohdalta tulostettua luokan kaksi dequeta iteraattorien avulla?
Mod. korjasi kooditagit: virheilmoitus ei ole C++-koodia.
Tuossahan lukee ihan selvällä kielellä, mistä virhe johtuu: yrität vertailla kahden eri dequen iteraattoreita. Koodistakin virhe näkyy heti: for-silmukoissasi begin-kutsussa on it->second mutta end-kutsussa ei.
Lisäksi sinun kannattaisi kyllä opetella käyttämään viittauksia ja vakioita. Nykyinen koodisi nimittäin luo hirmuisen määrän kopioita kaiken maailman jonoista ja mapeista ja niiden sisältämistä Pala-olioista. Lisää kaikkiin yllä näkyviin parametreihin tyypin ja nimen väliin ”const&” ja käytä iterator-tyypin sijaan const_iterator-tyyppiä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.