• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

STL iterator wiki

Object Storage Arubacloud
+1 głos
196 wizyt
pytanie zadane 17 lipca 2019 w C i C++ przez niezalogowany

Czy ja coś źle rozumiem?

https://pl.wikibooks.org/wiki/C%2B%2B/Iteratory

w przeciwieństwie do wskaźników, korzystając z iteratora nie musimy martwić się czy przypadkiem nie przekroczyliśmy zakresu pojemnika ani czy poprawnie wskazuje nam on na element.

iterator++  lub  ++iterator   // inkrementacja jest niemożliwa po przekroczeniu końca

kod:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector <int> v1 ={0,1,2,3,4,5,6,7,8,9};
    v1. shrink_to_fit();
   using it_v = vector <int> ::iterator;
   it_v it(v1.begin());
  for (int i=0;i<15;i++)cout <<*(it++)<<endl;
  return 0;
}

wyjście

0
1
2
3
4
5
6
7
8
9
1785908013
62228
7607184
7602368
1802750765

komentarz 17 lipca 2019 przez tkz Nałogowiec (42,000 p.)
Jeśli chodzi o możliwość wykonania zadania, wszystkie działają równie dobrze. W końcu wszystkie one dostarczają obiekt, który spełnia wymagania iteratora i używasz ich do wskazywania tego samego elementu. Jednak wybrałbym opcję iterator, ponieważ typ jest bardziej wyrazisty, jeśli chodzi o to, jak zamierzamy go użyć. Iterator jest po prostu dużo "wyraźniejszy".

1 odpowiedź

+2 głosów
odpowiedź 17 lipca 2019 przez tangarr Mędrzec (154,860 p.)

Wszystko zależy od implementacji iteratora.

Użyłeś iteratora w nieprawidłowy sposób i odkryłeś niezdefiniowane zachowanie.
Podczas iteracji z użyciem iteratora powinieneś porównać swój iterator z iteratorem end().

for (it_v it = v1.begin(); it != v1.end(); it++)
    cout <<*it<<endl;

Pamiętaj, żeby nie użyć iteratora end() z innego obiektu.
 

komentarz 17 lipca 2019 przez niezalogowany
edycja 17 lipca 2019

No z reguły staram się pilnować zakresów, ale jak to przeczytałem to na Wikipedii.Podkusiło mnie sprawdzić czy przekracza zakres. Chyba bardziej niebezpiecznie niż wskaźniki?

i czy da się złapać wyjątek coś w tym stylu?

edit poprawka

  try {
        for(int i=0; i<30; i++)
            if((++it)!=v1.end()) // lub *it != int lepiej ale jak to zrobić
              cout <<*it<<' ';
            else
               throw 10;
    } catch(...) {
        cout<<"cos zle";
    }

A przede wszystkim. Poleci ktoś jakąś dobrą literaturę na temat wyjątków poza tym https://en.cppreference.com/w/cpp/error

komentarz 17 lipca 2019 przez j23 Mędrzec (194,920 p.)

Chyba bardziej niebezpiecznie niż wskaźniki?

Ani bardziej, ani mniej. Iteratory nie powstały po to, by uchronić programistę przed problemami, które stwarzają zwykłe wskaźniki - też można nimi przekroczyć zakres, o czym się przekonałeś, i też mogą wskazywać na nieistniejące obiekty. Ten cytat nie jest zgodny z prawdą... przynajmniej w odniesieniu do iteratorów z STL-a.

komentarz 18 lipca 2019 przez niezalogowany

Ten cytat nie jest zgodny z prawdą... przynajmniej w odniesieniu do iteratorów z STL-a.

I jeżeli, tak jest to warto by było edytować. Ja tego nie zrobię, bo jeszcze nie ten poziom. Mógłbym dodatkowo bzdurę napisać, a przecież Wikipedii nie chodzi o to. Jakby jakiś polityk chciał się wypowiedzieć o iteratorach, to prasa znowu, miałaby co pisać :).

Bardziej niebezpiecznie, napisałem tak, bo większy zakres bez błędu przechodzą.

Założyłem inny wątek, ale złapałem o co chodzi i go ukryłem. Ten powstał niejako przy okazji. Wikipedię uważam za bardzo fajnie źródło wiedzy, polskojęzyczne, dla początkujących. Może nie jest to "cppreference w wersji ang.",ale przy kulejącym angielskim, się przydaje .

A tak przy okazji, czy jest możliwość na stałe włączenie podpowiedzi w c::b, tj. jak się naciśnie kropkę po obiekcie, to wyskakują, a ja chciałbym np w panelu bocznym. I druga sprawa, czy jest możliwość komentarza "//", jak w Qt, że zaznaczam obszar i wszystko jest komentarzem jednym kliknięciem.

komentarz 18 lipca 2019 przez niezalogowany

@fisker 

i czy da się złapać wyjątek coś w tym stylu?

catch (int integerCode) {/*...*/}

 I druga sprawa, czy jest możliwość komentarza "//", jak w Qt, że zaznaczam obszar i wszystko jest komentarzem jednym kliknięciem.

http://wiki.codeblocks.org/index.php/Keyboard_Shortcuts

Na poprzednie pytanie nie znam odpowiedzi, ale raczej można to włączyć.

komentarz 18 lipca 2019 przez niezalogowany
Dzięki  ctr+shift+c dokładnie mi oto chodziło.

Podobne pytania

+1 głos
0 odpowiedzi 91 wizyt
pytanie zadane 19 czerwca 2019 w Sieci komputerowe, internet przez wsnofi Bywalec (2,680 p.)
0 głosów
1 odpowiedź 173 wizyt
0 głosów
1 odpowiedź 422 wizyt
pytanie zadane 19 marca 2019 w C i C++ przez Hiskiel Pasjonat (22,830 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...