Re: iteratory, na czy pomiędzy, python
  Home FAQ Contact Sign in
pl.comp.lang.c only
 
Advanced search
POPULAR GROUPS

more...

 Up
Re: iteratory, na czy pomiÄ™dzy, python         

Group: pl.comp.lang.c · Group Profile
Author: Sektor van Skijlen
Date: May 13, 2008 17:06

Dnia Tue, 13 May 2008 00:24:24 -0700 (PDT), Maciej Sobczak skrobie:
> On 12 Maj, 23:11, Sektor van Skijlen
> guess.if.gmail.com.is.valid.or.invalid> wrote:
>> Nie, wbrew temu co ci si? wydaje, jedno i drugie ma to samo ?ród?o. W STL-u
>> tego nie napisali, ale sytuacja jest dok?adnie taka sama
> W STLu wskaźniki są iteratorami. W szczególności wskaźniki char* są
> iteratorami. Jak zapewne wiesz (jest na to paragraf), jednostkÄ…
> adresowania w C++ jest bajt a nie jego krawędź -> wskaźnik wskazuje
> *na* bajt a nie pomiędzy -> iteratory w STLu wskazują *na* elementy a
> nie pomiędzy.
> Już to, zdaje się, przerabialiśmy.

Ale do niczego nie doszliśmy, bo ty wciąż nie rozumiesz tej jednej podstawowej
sprawy.

Wskaźnik, powiadasz? Wskaźnik wskazuje ci na komórkę pamięci (załóżmy w
uproszczeniu na potrzeby rozważań, że komórka ma cztery bajty). Wszystkie
komórki pamięci są ułożone w szeregu jedna za drugą. Jest ich również
określona ilość. To wszystko oznacza, że mamy do czynienia ze zbiornikiem
sekwencyjnym. I od początku istnienia procesorów od zawsze, od procesora 4004
lub nawet wcześniej, mieliśmy do czynienia z pamięcią jako modelem zbiornika
sekwencyjnego.

Reguły dotyczące krawędzi elementów zbiornika sekwencyjnego dotyczą dokładnie
tak samo komórek pamięci, tak samo znaków w jednej linii edytora tekstu, tak
samo wagoników w kolejce górskiej i klawiszy fortepianu. To wszystko są modele
zbiornika sekwencyjnego. A w każdym zbiorniku sekwencyjnym każdy element ma
swój tył i przód, ewentualnie jeśli przyjmujesz perspektywę "z boku", prawą i
lewą krawędź (załóżmy, że elementy są ułożone od lewej do prawej).

I możesz sobie numerować wagoniki, wskazywać pojedyncze znaki i indeksować
komórki pamięci. I upierać się, że istnieją tylko numery elementów. Ale żeby
udowodnić, że nie istnieją krawędzie, musisz najpierw udowodnić, że zbiornik
nie jest zbiornikiem sekwencyjnym.

Oczywiście, jeśli zbiornik nie jest zbiornikiem sekwencyjnym, to nie istnieje
również indeksowanie, ale to tak na marginesie.
> BTW - w Adzie w kontenerach też tak jest - jest nawet wołami napisane
> w standardzie, że "cursor (bo tak się tam nazywają iteratory) is a
> reference to an element".

Czy w Adzie mają również past-the-end? Bo przy takiej implementacji to chyba
musi.

Tylko w językach, w których adresowanie elementów zbiornika robi się wyłącznie
przez indeksy, zdarza się, że nie ma past-the-end (np. Tcl). Tyle tylko, że
przy takim rozwiązaniu trzeba w szczególny sposób traktować puste zakresy.
> Nie ma za to nic o krawędziach ani o pustych
> przestrzeniach ani o żadnym innym wypaczeniu geometryczno-
> strukturalnym.

Maciek, zrozum wreszcie: zbiorniki sekwencyjne to jest pojęcie czysto
abstrakcyjne występujące w codziennym życiu. To jest model matematyczny.
Języki programowania nie mają tutaj nic do powiedzenia - fakt, że gdzieś "nie
piszą o krawędziach" nic nie znaczy. Jeśli piszą o zbiornikach, które są
indeksowane, i które mają ułożone elementy jeden za drugim, to te zbiorniki
*mają krawędzie*.
> Czyli masz już co najmniej dwa języki, gdzie de jure iterator wskazuje
> *na* element a nie pomiędzy.

Bardzo dobrze - niech właśnie wskazuje na element! Najlepsza implementacja
iteratora to właśnie taka, która wskazuje na element, a nie na krawędź, a
jako wskazywaną krawędź przyjmujemy lewą przy założeniu, że kierunek postępu
jest w prawo.

I dlatego również iterator odwrócony wskazuje na element o jeden wcześniejszy,
niż jego iterator bazowy. Właśnie dlatego, że iterator odwrócony ma wciąż
wkazywać na TĄ SAMĄ KRAWĘDŹ, na która wskazywał iterator oryginalny. Tylko że
ten iterator ma kierunek w lewo, więc jego wskazywaną krawędzią będzie prawa
krawędź wskazywanego elementu.

W Javie mają z tym łatwiej - nie wiem, czy mają tam coś takiego jak klasę
ReverseIterator, ale byłoby łatwo ją zrobić. Powinna tylko opakowywać
oryginalny iterator, w swoim previous() wołać jego next(), a w swoim next()
wołać jego previous(). Oczywiście nadal występuje parę podobieństw do tego, co
masz w STL-u - dla takiego iteratora next() zwróci element o jeden
wcześniejszy, niż next() wołane na oryginalnym iteratorze.
>> bo jest to ogólna
>> teoria sekwencji
> Jeżeli autorzy innych języków preferują inną nomenklaturę to ich
> problem, ale nie rób z tego ogólnej teorii w informatyce.

Po pierwsze, nie ja robię, tylko stwierdzam fakt, że istnieje. Po drugie, nie
w informatyce, tylko w codziennym życiu.
> Ciekawa obserwacja statystyczna na podstawie próbki danych z naszej
> grupy: języki mające standard ISO wskazują na element, podczas gdy
> języki nie mające standardu

standardu ISO.
> wskazują pomiędzy.

Wszystkie wskazują pomiędzy. Tylko języki mające standard ISO nie robią z tego
fetyszu.
> Jak nic wyglÄ…da mi to na spisek polityczny.

Nie, po prostu twórcy "tamtych języków" stwierdzili, że nie będą robić
jakiegoś głupiego past-the-end. No to cóż, nie chcieliście mieć past-the-end,
to macie popierdzielony model iteratora.

--
// _ ___ Michal "Sektor" Malecki
\\ L_ |/ `| /^\ ,() gmail.com>
// \_ |\ \/ \_/ /\ C++ bez cholesterolu: http://www.intercon.pl/~sektor/cbx
"Java is answer for a question that has never been stated"
no comments
diggit! del.icio.us! reddit!

RELATED THREADS
SubjectArticles qty Group
Re: czy da siÄ™ bezpiecznie je?dzić po Polsce?pl.misc.samochody ·
Re: Kartki na benzynÄ™!!! Czy bÄ™dzi e mniej blachosmrodów na ulicach??pl.rec.rowery ·
Re: Czy to prawda, ze dzisalt.pl.tvn.bigbrother ·
jaworzyna krynicka - czy ktoÅ› jeździÅ‚ w weekend?pl.rec.sport.zimowe ·
Re: czy dzi¶ co¶ zagrzmi??pl.misc.meteorologia ·