Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Voiko listiin laittaa tietueita?

Sivun loppuun

TsaTsaTsaa [26.01.2007 13:28:20]

#

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?

koo [26.01.2007 13:35:57]

#

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ä?

TsaTsaTsaa [26.01.2007 13:47:05]

#

koo kirjoitti:

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ä?

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

Atte [26.01.2007 14:14:05]

#

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.

TsaTsaTsaa [26.01.2007 14:21:33]

#

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?

Atte [26.01.2007 14:52:28]

#

Laiskana laitan linkin:
http://www.cppreference.com/cppalgorithm/sort.html

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

koo [26.01.2007 15:01:27]

#

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()).

tn [26.01.2007 19:36:18]

#

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.

TsaTsaTsaa [26.01.2007 20:21:06]

#

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

koo [26.01.2007 21:39:23]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta