Iteratory C++ uznane za szkodliwe?

Na dzisiejszej konferencji Boost library, Andrei Alexandrescu, autor książki Modern C++ Design i Loki C++ library, wygłosił wykład zatytułowany "Iteratory muszą odejść" ( wideo, slajdy) o tym, dlaczego Iteratory są złe, a on miał lepsze rozwiązanie.

Próbowałem przeczytać slajdy z prezentacji, ale nie mogłem wiele z nich wyciągnąć.

    Czy Iteratory są złe? Czy jego zastępstwo jest naprawdę lepsze?
  1. czy implementatorzy C++ podniosą jego pomysły?
Author: Unknown, 2009-05-08

13 answers

Po pierwsze, aby odpowiedzieć na twoje pytania:

    Nie. W rzeczywistości argumentowałem gdzie indziej , że Iteratory są najważniejszą / fundamentalną koncepcją informatyki w historii. Ja (w przeciwieństwie do Andrei) również uważam, że Iteratory są intuicyjne . Tak, zdecydowanie, ale to nie powinno być zaskoczeniem.
  1. Hmm. Patrząc na Boost.Range i C++0x – czy już nie?

Duży wkład Andrei tutaj jest po prostu powiedzieć: porzucić koncepcję iteratorów ogólnie rzecz biorąc, patrz zakresy nie tylko jako wygodna owijarka, ale raczej jako podstawowa konstrukcja. Inne języki już to zrobiły (wiele z pojęć Andrei po prostu echo LINQ. NET lub iteratorów Pythona), ale wszystkie oferują tylko zakresy wyjściowe . Andrei argumentuje za różnymi typami zakresów, podobnie jak konwencjonalne kategorie iteratorów.

W tym świetle to dziwne, że zaczyna się od wyśmiewania arbitralności tych kategorii iteratorów.

Myślę też, że jego przykłady są poza tym, zwłaszcza kopiowanie plików: tak, wariant iteratora jest ogromnym ulepszeniem w stosunku do kodu z 1975 roku. Redukuje pętlę o skomplikowanym stanie załamania do jednej instrukcji. To, z czym tak naprawdę ma problem, to tylko składnia. Cóż, przepraszam: mówimy tu o C++ - oczywiście składnia jest brzydka. I tak, używanie zakresów jest poprawą-ale tylko składniowo.

Myślę też, że implementacja Andrei jest wyłączona. To, co tak naprawdę tam definiuje, to operacja DropUntil (nazywanie jest trudne!) z LINQ. Operacja find powinna zwracać jeden lub zero elementów (lub iterator!). Unikanie iteratorów nie jest moim zdaniem pomocne, ponieważ możemy chcieć zmodyfikować wartość bezpośrednio zamiast ją kopiować. Zwracanie zakresu jednoelementowego tutaj tylko dodaje narzut bez korzyści. Robienie tego jest złe, bo wtedy nazwa metody jest po prostu błędna i myląca.

To powiedziawszy, zasadniczo zgadzam się z Andriejem w prawie wszystkich punktach. Iteratory, będąc moją koncepcją z informatyki, są z pewnością dużym obciążeniem składniowym i wiele zakresów (zwłaszcza generatorów nieskończonych) można (i powinno) wygodnie zaimplementować bez nich.

 39
Author: Konrad Rudolph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:35
  1. większość z nas w prosty sposób wykorzystuje je w znanych idiomach, jak np. w pętlach For do iteracji przez std:: vector. Programista czyta i wie o co chodzi. W naszym codziennym życiu programistycznym Iteratory nie są dobre ani złe, są po prostu "tym, co wykonuje pracę".
  2. Prawdopodobnie tak. Nie sÄ…dzÄ™.
 4
Author: Daniel Daranas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-08 09:49:37

Andrei czasami może być trochę prowokacyjny. Iteratory są pojęciem rozsądnym i dość fundamentalnym w tym sensie, że bity są. Ale tak jak większość bitów w C++ nie jest boolami, ale częścią większych typów, większość iteratorów powinna być traktowana na wysokim poziomie. Andrei ma rację, że odpowiednim poziomem do tego jest obiekt range. Ale nie wszystkie zakresy są odpowiednio eksponowane jako zakresy iteratora, jak pokazuje sentinel istream_iterator. To tylko hack do stworzenia sztucznego iteratora końcowego. Nie sądzę. jego pomysły zostaną jednak wychwycone przez implementacje. C++1x będzie równie istotne jak C99.

 4
Author: MSalters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-08 10:44:25

Zgadzam się z nim, że Iteratory są w większości gorsze od zakresów i nie wiem, czy "coś lepszego" zostanie odebrane.

" dobro jest wrogiem najlepszych " jest tutaj mocno w grze, jak to zwykle bywa. Iteratory są użyteczne i mocno zakorzenione, więc trudno stwierdzić, czy coś lepszego, takiego jak zakresy, może je zastąpić w rozsądnym czasie.

 3
Author: Brian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-08 08:35:42

C++0x już robi pierwsze kroki:

  • odniesienia rvalue rozwiÄ…zujÄ… pewne problemy z traktowaniem kontenerów jako zakresów
  • zakresy zostaÅ‚y dodane do podstawowej biblioteki, w tym pojÄ™cia zakresu

Przejście na zakresy bez utraty funkcji iteratora (pomyśl o wszystkich kombinacjach kategorii iteratora, const-ness i rvalue-Ness) jest trudne, zwłaszcza jeśli próbujesz uwzględnić nieskończone i zmienne zakresy.

 3
Author: James Hopkin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-08 09:31:56
  1. Nie, nie są złe, są bardzo sprytnym pomysłem w rzeczywistości. Jednak nie są one idealne i jest miejsce na ulepszenia w koncepcji iteratora.

  2. Rozwiązuje wiele rzeczywistych problemów z iteratorami. Na przykład, żmudne (również podatne na błędy) w wielu przypadkach jest odpytywanie dwóch oddzielnych obiektów, iteratorów, z jednego kontenera, a następnie przekazywanie ich jako jeszcze dwóch oddzielnych obiektów do algorytmu. Dlaczego nie przekazać jednego obiektu wokół? Nawet std::pair<iterator, iterator> zrobiłby na surowy zakres, który jest łatwiejszy do manipulowania-jeden obiekt, nie dwa. Warto również rozważyć a range is an iterator. Tak sugeruje Andriej. Przy okazji, niektóre z tych problemów zostały już rozwiązane przez Boost.Zakres .

  3. Spodziewałbym się, że tak się stanie, ale to nie będzie rewolucja, a ewolucja.

 3
Author: mloskot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-25 23:59:05

Myślę, że powinniśmy używać zakresów obok iteratorów, tzn. powinniśmy wybrać sposób ewolucji, a nie rewolucji.

 2
Author: anon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-08 09:27:47

Czy Andrei nie próbuje zrobić jakiegoś ukrytego marketingu dla języka D (obecnie pracuje z nim)...?

Andrei twierdzi, że kontenery są w porządku, ale Iteratory są brzydkie, nieintuicyjne, podatne na błędy i niebezpieczne, trudne do wdrożenia (cóż, ten ostatni wydaje się być raczej prawdziwy...) I co mamy w C++... wskazówki? Czyż nie są brzydkie?../ niebezpieczny? Ale z radością ich przyjęliśmy i żyliśmy z nimi.

Który z nich jest bardziej intuicyjny napisz:

for(auto i=foo.begin();i!=foo.end();++i)
    bar(*i);

Lub

for (auto r=foo.all(); !foo.empty(); foo.popFront())
        bar(r.front());

Iteratory można uzupełnić o zakresy i inne pomysły, ale myślę, że mają swoje miejsce i nie zostaną zastąpione.

 2
Author: Anonymous,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-12 06:53:35
  1. Sometimes
  2. Prawdopodobnie
  3. mało prawdopodobne, przynajmniej nie przez wiele lat
 1
Author: PowerApp101,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-08 08:37:56

Jak każdy API lub funkcja, jeśli niewłaściwie używane Może powodować wiele problemów z identyfikacją trudne. Iteratory były używane w wielu projektach, ale zawsze zachowując niezbędną opiekę wymaganą zgodnie z ich charakterystyką. Jego stosowanie powinno być poprzedzone dobrym zrozumieniem ich ograniczeń. Iteratory mogą być bardzo przydatne, jeśli użytkownik jest prawidłowo.
Pytania te sÄ… zwiÄ…zane :
Czy Jest jakiś sposób, aby sprawdzić, czy iterator jest poprawny?
czy wolę Iteratory niż konst_iteratorzy?

 1
Author: lsalamon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:32:38

Nie zgadzam się zarówno z Andrzejem, jak i Konradem i ze mną : -)

Najbardziej fundamentalną koncepcją jest interfejs, a nie iterator i to jest dość oczywiste w każdej pracy, którą ktoś dzisiaj wykonuje (co dotyczy między-biblioteki, między-języka, między-kompilatora, między-systemu operacyjnego, między-platformy, wymieniasz między sobą: -)

Ani iterator, ani range (poza używaniem na poziomie źródłowym) nie oferują niczego więcej niż czysty i prosty, nieinwazyjny lub natrętny, nie udostępniony lub udostępniony, nie unikalny lub unikalny: pointer ! Czysty wskaźnik do wpisanych danych jest po prostu uniwersalny i możesz uczynić dane zmiennymi lub niezmiennymi i wiele innych rzeczy. All interface is to kolejny poziom indrection to it, a jednocześnie jest przyjazny dla maszyn i kompilatorów wszelkiego rodzaju, plus znacznie bezpieczniejszy, zmniejszając wykorzystanie iteratorów i zasięgu do szczegółów implementacji.

Do tego stopnia, że nie jestem w stanie zrobić połowy 'słusznej rzeczy' TM, ale są wyraźnie gorsze w swoich koncepcjach iteracji i znacznie więcej do tego, co Ty można zrobić z STL, zachować kontrolę i tak dalej i dalej (ale otoh, mają lepsze metadane, a co za tym idzie lepszy, czystszy model). Punkt jest z interfejsami można zbudować dowolną abstrakcję chcesz i zaspokoić, dobrze prawdopodobnie sprzeczne, ale zasadniczo nie ma myślenia: optymalne, i runtime lub skompilować czas reprezentacji danych i kodu (heck istotne dla algorytmów i kompilatorów i maszyn wirtualnych i co nie).

Możliwe jest nawet zoptymalizowanie go dla systemów "dynamicznych" /składowych do "runtime" inlining (screw HotSpot VM: -).. Do tego stopnia, postęp do 1975 roku jest minimalny, co widać po ogromnym obciążeniu branżowym (jest wszędzie, gdzie spojrzysz, w tym ta strona, jej wykorzystanie zastrzeżonych i otwartych technologii itp.; w informatycznym idealizmie, cóż, ten rodzaj "pracy" związanej z interfejsem nie powinien istnieć)..

 1
Author: rama-jka toti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-08 18:54:49

Myślę, że implementatorzy C++ będą mieli pełne ręce roboty, produkując pełne wsparcie dla C++0x, bez wdrażania nowych, niestandardowych paradygmatów.

 0
Author: anon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-08 08:29:37

Jedynym argumentem, jaki widzę z tej prezentacji, jest niemożność zdefiniowania zakresów, a propozycja C++0x "Range for statement" wydaje się w pewnym stopniu eliminować ten problem. może nie powinno to być argumentem o tym, czy Iteratory powinny / nie powinny być w ogóle używane, ale więcej w jakich sytuacjach powinny / nie powinny być używane?

 0
Author: Stowelly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-08 10:54:53