Article View: pl.comp.lang.c
Article #267897Re: Ciemna strona C++
From: Sektor van Skijlen
Date: Thu, 10 Jan 2008 23:46
Date: Thu, 10 Jan 2008 23:46
70 lines
5264 bytes
5264 bytes
Dnia Thu, 10 Jan 2008 19:47:02 +0100, Maciej Piechotka skrobie:
> On Thu, 10 Jan 2008 16:31:12 +0000, Sektor van Skijlen wrote:
> >> > Z ciekawości, zajrzałem co ma Java. Java posiada algorytm
> >> > java.util.Collections.sort() (w dwóch wersjach, jedna z
> >> > komparatorem). Pierwszym argumentem jest LISTA (nie zakres
> >> > elementów). W żadnej klasie dziedziczącej po *.Collections nie jest
> >> > ona przesłonięta.
> >> >
> >> > Co więcej, *.Collections.sort() ma gwarancję, że jest stabilny.
> >> > Ciekawe, dlaczego?
> >
> >> Bo nie dawali wersji niestabilnej?
> >
> > Zgadza się. A dlaczego nie dali wersji niestabilnej?
> Jeśli mnie pamięć nie myli to java.util.Collections.sort() kopjuje całą
> listę do tablicy, sortuje tablicę i wstawia do listy.
> Uniwersalny stable sort:
> template <class iterator>
> void my_sort(iterator from, iterator to) {
> typename iterator::difference_type distance = std::distance(from,
> to);
> typename iterator::value_type *refs = new typename
> iterator::value_type[distance];
> std::copy(from, to, refs);
> std::stable_sort(&refs[0], &refs[distance]);
> std::copy(&refs[0], &refs[distance], from);
> delete[] refs;
> }
> Problem - kopiuje wszystko do osobnej tablicy
To jest akurat żaden problem. Prawdziwy problem jest w pierwszej linijce.
std::distance dla zbiorników dwukierunkowych posiada liniowy koszt w długość
ciągu.
Oczywiście można to zamortyzować stosując vector zamiast tablicy i kazać mu
się rozrastać w miarę dodawania elementów. Wtedy nie musisz liczyć elementów
distance'm. Natomiast jeśli już i tak przekopiowałeś elementy do wektora, to
po cholerę stosować stable_sort - zastosuj normalne sort.
> (dodatkowy narzut + > dodatkowa pamięć), ale da się.
Bąbelkowo też się da, ale nie o to nam chyba chodzi, nie? Ten sposób, który
pokazałeś jest jedynie obejściem problemu, bo tam sortowanie odbywa się już z
użyciem iteratorów swobodnego dostępu, na zapasowym zbiorniku.
A właśnie po to lista ma swoją metodę sort, bo ma wtedy możliwość dobrania się
do wewnętrznej reprezentacji i podczas sortowania obywa się bez jakichkolwiek
przydziałów pamięci, poza tym jednym, jednorazowym na martwe elementy list
używanych jako zapasów (btw. na bazie tej listy zrobiłem kiedyś listę
intruzyjną i ta mimo podobnej budowy posiada martwy element jako zwykłe pole i
jest ono typu bazowego węzła, więc tam to już w ogóle obywam się bez żadnych
przydziałów pamięci). Tam całe sortowanie odbywa się poprzez przepinanie
węzłów. Cały myk więc polega na tym: jak przepinać węzły tak, żeby sam węzeł
wystarczył do wykonania operacji.
Nie mówię, że się nie da. Tylko z jakiegoś powodu - przykładowo - metoda
splice nawet ta, która "wyplata" jedynie zakres elementów z jednej listy do
drugiej, potrzebuje nie tylko iteratorów granicznych zakresu, ale również
referencji do listy, z której je wyplata. Dlaczego?
--
// _ ___ Michal "Sektor" Malecki <sektor(whirl)kis.p.lodz.pl>
\\ L_ |/ `| /^\ ,() <ethouris(O)gmail.com>
// \_ |\ \/ \_/ /\ C++ bez cholesterolu: http://www.intercon.pl/~sektor/cbx
"Java is answer for a question that has never been stated"
Technical Details
Message-ID:
<fm6aov$3eu$1@kujawiak.man.lodz.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!newsfeed.silweb.pl!news.man.lodz.pl!not-for-mailReferences:
<fghgeo$spf$1@nemesis.news.tpi.pl> <618565031.20071107113041@pkierski.net> <fgt6sh$jov$1@news.vectranet.pl> <fgtb6j$nur$1@news.vectranet.pl> <fgv6ba$k14$1@bozon2.softax.pl> <fgvkne$u3b$1@news.vectranet.pl> <fh1tjd$dtt$1@bozon2.softax.pl> <fh2lj6$qkh$1@news.vectranet.pl> <fha3as$pap$1@bozon2.softax.pl> <fhaj8u$e02$1@news.vectranet.pl> <fhf09d$ohq$1@bozon2.softax.pl> <fhfi9l$640$1@news.vectranet.pl> <fhurmu$5d9$1@bozon2.softax.pl> <fhv020$8k1$1@news.vectranet.pl> <fi1bs4$nn3$1@bozon2.softax.pl> <fi27ds$gt1$1@kujawiak.man.lodz.pl> <fi458p$fmv$1@bozon2.softax.pl> <fi9ckc$2u5$1@kujawiak.man.lodz.pl> <fimb7n$80v$1@bozon2.softax.pl> <fj5k6j$r3e$1@kujawiak.man.lodz.pl> <fj68ei$vbo$1@bozon2.softax.pl> <fjmo4o$a5r$1@kujawiak.man.lodz.pl> <fjouia$gr3$1@bozon2.softax.pl> <fjpmln$o6q$1@kujawiak.man.lodz.pl> <fjtv6o$kc$1@bozon2.softax.pl> <fkea3q$lup$1@kujawiak.man.lodz.pl> <fkobo3$mdl$1@bozon2.softax.pl> <fm5h8g$nbs$1@kujawiak.man.lodz.pl> <6q5i55-pt.ln1@router.piechotka.com.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!newsfeed.silweb.pl!news.man.lodz.pl!not-for-mail
From: Sektor van Skijlen <ethouris@guess.if.gmail.com.is.valid.or.invalid>
Newsgroups: pl.comp.lang.c
Subject: Re: Ciemna strona C++
Date: Thu, 10 Jan 2008 23:46:39 +0000 (UTC)
Organization: LODMAN - Metropolitan Area Network in LODZ, Poland
Lines: 70
Sender: Michal Malecki <sektor@student.kis.p.lodz.pl>
Message-ID: <fm6aov$3eu$1@kujawiak.man.lodz.pl>
References: <fghgeo$spf$1@nemesis.news.tpi.pl> <618565031.20071107113041@pkierski.net> <fgt6sh$jov$1@news.vectranet.pl> <fgtb6j$nur$1@news.vectranet.pl> <fgv6ba$k14$1@bozon2.softax.pl> <fgvkne$u3b$1@news.vectranet.pl> <fh1tjd$dtt$1@bozon2.softax.pl> <fh2lj6$qkh$1@news.vectranet.pl> <fha3as$pap$1@bozon2.softax.pl> <fhaj8u$e02$1@news.vectranet.pl> <fhf09d$ohq$1@bozon2.softax.pl> <fhfi9l$640$1@news.vectranet.pl> <fhurmu$5d9$1@bozon2.softax.pl> <fhv020$8k1$1@news.vectranet.pl> <fi1bs4$nn3$1@bozon2.softax.pl> <fi27ds$gt1$1@kujawiak.man.lodz.pl> <fi458p$fmv$1@bozon2.softax.pl> <fi9ckc$2u5$1@kujawiak.man.lodz.pl> <fimb7n$80v$1@bozon2.softax.pl> <fj5k6j$r3e$1@kujawiak.man.lodz.pl> <fj68ei$vbo$1@bozon2.softax.pl> <fjmo4o$a5r$1@kujawiak.man.lodz.pl> <fjouia$gr3$1@bozon2.softax.pl> <fjpmln$o6q$1@kujawiak.man.lodz.pl> <fjtv6o$kc$1@bozon2.softax.pl> <fkea3q$lup$1@kujawiak.man.lodz.pl> <fkobo3$mdl$1@bozon2.softax.pl> <fm5h8g$nbs$1@kujawiak.man.lodz.pl> <6q5i55-pt.ln1@router.piechotka.com.pl>
NNTP-Posting-Host: student.kis.p.lodz.pl
Mime-Version: 1.0
X-Trace: kujawiak.man.lodz.pl 1200008799 3550 212.191.89.21 (10 Jan 2008 23:46:39 GMT)
X-Complaints-To: abuse@man.lodz.pl
NNTP-Posting-Date: Thu, 10 Jan 2008 23:46:39 +0000 (UTC)
User-Agent: tin/1.8.3-20070201 ("Scotasay") (UNIX) (FreeBSD/6.2-RELEASE-p3 (sparc64))
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit