Eli semmonen pieni kysymys vaan, että onko stringillä ja vectorilla jotain suuria eroja? Kumpi on "parempi" (jos on)? Tai jos ne ovat liian erilaisia vertailuun niin mihin vector soveltuu paremmin kuin string ja toisinpäin? Yritin tuossa opiskella vectoreista, ja vaikka englanti sujuu, niin "ohjelmointislangi" vielä ei niin hyvin :D
Kiitos :)
No tuota vertailu std::string ja std::vector on lähtökohtaisesti hiukan outo. Luulen että ajattelet niiden olevan samanlaisia, koska molemmissa voidaan viitata tiettyyn alkioon []-operaattorilla. Tähän se samankaltaisuus kyllä loppuukin aika lailla.
Esimerkiksi std::vector voi säiliöä monia eri tyyppisiä alkioita esimerkiksi std::string olioita, mutta aivan yhtä hyvin myClass tyyppisiä itse tehdyn luokan olioita. Esimerkki selventänee asiaa.
#include <string> #include <vector> #include <iostream> class henkilo { int ika; std::string nimi; public: henkilo(std::string nimi, int ika) { this->nimi = nimi; this->ika = ika; } }; int main() { std::string nimi; std::vector <std::string> nimet; std::vector <henkilo> henkilot; /** Tämä on väärin lue alta korjaus **/ //henkilot.push_back("Nimi", 12); henkilot.push_back(henkilo("Nimi", 12)); nimet.push_back("Nimi"); nimi = "Nimi"; return 0; }
Siis vektori voi paitsi säiliöä monia tyyppejä, niin siihen voidaan säiliöä useita tietueita. std::string voi säiliöä vain useita merkkejä.
Teuron henkilot.push_back-rivillä pitäisi olla vielä konstruktorikutsu parametrien ympärillä:
henkilot.push_back(henkilo("Nimi", 12));
Muuten asia oli ihan järkevää. C++:n luokkia miettiessä kannattaa unohtaa kokonaan ne C:n vastaavat viritelmät.
Olet toki oikeassa tein korjaukset, mutta jätin alkuperäisen paikalleen, ettei viestiltäsi katoa tarkoitus. Ja mitä paremmuuteen tulee, niin minusta työkaluista vasara on ehdottomasti paras :)
Kiitos, tämä selvensi asiaa paljon :)
En malta olla mainitsematta, mitä uusi C++-standardi sallii. Tämä on ihan kunnollista C++0X-kieltä (käänsin -Wallin kanssa ja ajoin). Tein tämän Teuron koodin pohjalta, joten en jaksanut muuttaa tuota konstruktoria käyttämään alustussyntaksia. Lisäksi en kehdannut kirjoittaa sekakielisiä get_ika ja get_nimi-metodeja, koska sellainen ei ole tervettä. :)
// g++ --std=c++0x #include <string> #include <vector> #include <iostream> #include <ostream> class henkilo { int ika_; std::string nimi_; public: henkilo(std::string nimi, int ika) { this->nimi_ = nimi; this->ika_ = ika; } int ika() const { return ika_;} std::string nimi() const { return nimi_;} friend std::ostream& operator<<(std::ostream& out, const henkilo& hlo); }; std::ostream& operator<<(std::ostream& out, const henkilo& hlo) { out << hlo.nimi() << ' ' << hlo.ika() << " vee"; return out; } int main() { std::vector <henkilo> henkilot; henkilot.emplace_back("Uolevi", 27); henkilot.emplace_back("Sepeteus", 29); henkilot.emplace_back("Kyllikki", 23); // vaatisi ilmeisesti g++ 4.6:n tai uudemman /* for (auto henkilo: henkilot) { std::cout << henkilo << std::endl; } */ for (auto i = henkilot.begin(), end = henkilot.end(); i != end; ++i) std::cout << *i << std::endl; return 0; }
Tämän voi siis kääntää uudella G++-kääntäjällä jo nyt. Minun käytössäni on tällä hetkellä versio on 4.5.2, joten tuo uusi foreach-tyylinen silmukka ei vielä siinä toimi. En ole siten ihan varma, menikö sen syntaksi oikein. Wikipediasta katsoin.
Ja arvon Vesikuusi, kannattaa opetella sitä vanhemman C++-standardin mukaista kieltä vielä toistaiseksi. Kerkeät kyllä tutustua uuteen, kunhan se on siunattu viralliseksi standardiksi, ja kääntäjät tukevat sitä laajemmin kuin nykyään.
Kiitos mielenkiintoisesta esimerkistä, Karjalainen :)
Eipä kestä. Huomasin jälkikäteen, että tuli taas jätettyä ylimääräinen rivi koodia ohjelmaan. Tuossa esimerkissäni on tuo friend-sanalla alkava rivi turha, koska ystäväfunktio ei käytä luokan private-muuttujia. Ajattelin olla korrekti, ja kirjoittaa getter-funktiot niille yksityisille tiedoille, ja unohdin sen jälkeen kuitenkin poistaa friend-määrittelyn, jonka pistin koodiin alunperin ns. automaattisesti.
Lisäksi minulla on aina vyö ja henkselit päällä, kun ohjelmoin C++-kieltä (heh, tarvitsisi ehkä myös kypärän). No ei tämä tyylirikko varmaan ketään kovin ahdista, mutta selvyyden vuoksi halusin sanoa, että ei kannata tuosta tavasta turhaan ottaa mallia :)
Engl.kielisessä Wikipediassa on ihan hyvä yleiskatsaus uudesta C++-standardista. Lisäksi Herb Sutterin blogissa on monenlaista juttua perusteellisemmin selitettynä. Viralliset standardidokumentit ovat jo sen verran työläitä lukea, että en niitä linkitä.
Jep, Wikipediasta onkin tullut aiemmin luettua C++0x:stä. Sen virallistumista odotellessa..
Aihe on jo aika vanha, joten et voi enää vastata siihen.