Moro!
Eli ongelma on se, että voinko tehdä listin, joka sisältää structeja?
Siis voinko tehdä näin:
struct Tietue { ... }; int main() { ... list< Tietue > lista; ... }
En ainakaan onnistunut noin tekemään, mutta teiltä viisaammilta nyt kysynkin, onko tuohon joku konsti?
Kyllä voi laittaa ja noin se periaatteessa tehdään. Mikä siinä ei onnistunut, puuttuiko muuta kuin #include <list>
alusta ja nimiavaruuden määre std::
listamäärittelystä?
koo kirjoitti:
Kyllä voi laittaa ja noin se periaatteessa tehdään. Mikä siinä ei onnistunut, puuttuiko muuta kuin
#include <list>
alusta ja nimiavaruuden määrestd::
listamäärittelystä?
Ei puuttunut kumpikaan.
Voi olla että en sitten vaan osaa viitata niihin alkioihin oikein. Netistä löysin ohjeen ja tein sen näin:
list< Tietue > lista; list< Tietue >::iterator lci; for (lci = lista.begin() ; lci != lista.end() ; lci++) { cout << *lci.plaaplaa << endl; }
Plaaplaa siis on structissa oleva kenttä.
Koodissa oleva ongelma on pieni; viittaat alkioihin C++:ssan syntaksin vastaisesti, kuten epäilitkin. Totta, että noinkin sen voisi kuvitella toimivan. Oikein se menee kuitenkin näin:
cout << lci->plaaplaa << endl;
-> osoittaa siis suoraan alkion sisältöön.
Atte kirjoitti:
Koodissa oleva ongelma on pieni; viittaat alkioihin C++:ssan syntaksin vastaisesti, kuten epäilitkin. Totta, että noinkin sen voisi kuvitella toimivan. Oikein se menee kuitenkin näin:
cout << lci->plaaplaa << endl;-> osoittaa siis suoraan alkion sisältöön.
Jep, nyt rupesi toimimaan, kiitos vaan.
Kuinkas sitten tuo sort()-funktio toimii tuollaiselle structilistalle? Pitääkö jotenkin sanoa, että minkä kentän mukaan järjestetään?
Laiskana laitan linkin:
http://www.cppreference.com/cppalgorithm/sort.
Sivun lopussa selostetaan. Teet siis funktion, joka vertaa structin jäseniä haluamallasi tavalla, ja käytät sitä sort-funktiossa syntaksilla sort(alku,loppu,vertausfunktio).
Tuo laiskan miehen linkki on täyttä asiaa. Täydennän vielä parilla jutulla.
Ensiksi, listan sorttaaminen on todella tehoton juttu. Jos järjestely on tärkeää, voi olla järkevämpää käyttää esimerkiksi jonkinlaista deque-viritystä listin sijaan.
Jos tuolle Tietue-tyypille on määritelty <-vertailuoperaattori, sorttaaminen sujuu helposti funktiokutsulla sort(lista.begin(), lista.end())
.
Jos vertailuoperaattoria ei ole tai haluaa järjestellä alkiot jonkun muun kriteerin mukaan, pitää tehdä sopiva vertailupredikaatti. Se voi olla funktio, niin kuin Aten linkissä, mutta tehokkaampi tapa on tehdä funktio-olio:
struct Vertaa { bool operator()(Tietue const &a, Tietue const &b) { return a.plaaplaa < b.plaaplaa; } };
Sitten sanotaan, että sort(lista.begin(), lista.end(), Vertaa())
.
koo kirjoitti:
Se voi olla funktio, niin kuin Aten linkissä, mutta tehokkaampi tapa on tehdä funktio-olio:
Minua kiinnostaisi tietää, millä perusteella tuo tapa on tehokkaampi.
No nyt rupesi pelittämään!
Jonkin aikaa piti kyllä ihmetellä, että miksi ei lähde toimimaan, mutta sitten löysin tiedon, että listille tuota sorttia ei voi käyttää yllämainitulla tavalla, vaan listin jäsenfunktiona eli lista.sort(vertaa).
TsaTsaTsaa kirjoitti:
Jonkin aikaa piti kyllä ihmetellä, että miksi ei lähde toimimaan
Sori, että tuli vähän erheellistä infoa. Homma olisi mennyt heti kohdalleen, jos olisin vaivautunut tarkistamaan dokumentaatiosta, että tavallinen sort
tahtoo tosiaan parametreikseen random iteraattorit. Hyvä, että löytyi kuitenkin.
tn kirjoitti:
koo kirjoitti:
tehokkaampi tapa on tehdä funktio-olio
Minua kiinnostaisi tietää, millä perusteella tuo tapa on tehokkaampi.
Tuo sort
on templaatti ja tavallisesti siitä tulee inline-koodia. Jos funktio-olion toteutus on näkyvissä, se yleensä inlinettyy sort
-inlinetyksen sisällä.
Funktion tapauksessa inlinetys tyssää nykyvehkeillä helposti pointteriparametrin käyttöön, vaikka funktio olisi kuinka määritetelty inlineksi.
Enpä tiedä, kannattaako tuota ihmeesti murehtia. Inlinetyksen ansiosta C++:n sort
nyt kuitenkin pelittää nopeammin kuin C:n qsort
. Joskus on iloa siitäkin, että funktio-olioon voi tallettaa jotain tietoa sisäisiin muuttujiin, vaikken sitä ole kyllä koskaan tarvinnut sorttauksen yhteydessä, mutta esmes for_each
:in kanssa kylläkin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.