🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #267900

Re: Ciemna strona C++

#267900
From: Maciej Piechotka
Date: Fri, 11 Jan 2008 19:07
76 lines
4903 bytes
On Thu, 10 Jan 2008 23:46:39 +0000, Sektor van Skijlen wrote:

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

Co do std::vector to nie byłem pewien co do unieważnień iteratorów a nie 
chciało mi się grzebać w dokumentacji. Co do stable_sort to chciałem 
emulować java.util.Collections.sort, które sortuje stabilnie. Dla mnie to 
podejście nie jest najlepsze jeśli mówimy o optymalizacji.

#include <algorithm>
#include <list>
#include <vector>

template <class iterator>
void universal_stable_sort(iterator from, iterator to) {
  std::vector<typename iterator::value_type> refs;
  std::copy(from, to, refs.begin());
  std::stable_sort(refs.begin(), refs.end());
  std::copy(refs.begin(), refs.end(), from);
}

template <class iterator>
void universal_sort(iterator from, iterator to) {
  std::vector<typename iterator::value_type> refs;
  std::copy(from, to, refs.begin());
  std::sort(refs.begin(), refs.end());
  std::copy(refs.begin(), refs.end(), from);
}

Pozdrawiam
-- 
I've probably left my head... somewhere. Please wait untill I find it.
Homepage (pl_PL): http://uzytkownik.jogger.pl/
(GNU/)Linux User: #425935 (see http://counter.li.org/)
Technical Details
Message-ID: <ncrk55-t9c.ln1@router.piechotka.com.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.us.edu.pl!news.nask.pl!news.nask.org.pl!news.internetia.pl!nnrpd.internetia.pl
References: <fghgeo$spf$1@nemesis.news.tpi.pl> <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> <fm6aov$3eu$1@kujawiak.man.lodz.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.us.edu.pl!news.nask.pl!news.nask.org.pl!news.internetia.pl!nnrpd.internetia.pl
From: Maciej Piechotka <uzytkownik2@gmail.com>
Newsgroups: pl.comp.lang.c
Subject: Re: Ciemna strona C++
Date: Fri, 11 Jan 2008 20:07:35 +0100
Organization: Netia S.A.
Lines: 77
Message-ID: <ncrk55-t9c.ln1@router.piechotka.com.pl>
References: <fghgeo$spf$1@nemesis.news.tpi.pl> <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> <fm6aov$3eu$1@kujawiak.man.lodz.pl>
NNTP-Posting-Host: 87-205-198-156.adsl.inetia.pl
Mime-Version: 1.0
X-Trace: mx1.internetia.pl 1200078629 24432 87.205.198.156 (11 Jan 2008 19:10:29 GMT)
X-Complaints-To: abuse@inetia.pl
NNTP-Posting-Date: Fri, 11 Jan 2008 19:10:29 +0000 (UTC)
X-Tech-Contact: usenet@internetia.pl
X-Orig-Path: router.piechotka.com.pl!news
User-Agent: Pan/0.132 (Waxed in Black)
X-Server-Info: http://www.internetia.pl/news/
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit