Hai scritto:
The std convention is to have the last iterator point beyond the last element
Penso di poter aiutare il tuo modello mentale dandoti due piccole risposte
(una sezione ciascuno).
- Non pensarci come al di là dell'ultima indicizzazione, considerala come indicizzazione basata sui bordi
- Perché l'indicizzazione basata sui bordi (indicizzazione dell'intervallo aperto a destra) è piacevole
Non pensarci come al di là dell'ultima indicizzazione, pensaci come indicizzazione basata sui bordi
Ho sostanzialmente semplificato e C ++ ha aggiunto questa sezione grazie a un commento molto utile di
Pupazzo di neve :
C++ iterators are defined in terms of "which item will it retrieve next" instead of "to which item is it currently pointing?
Quindi, mi aiuta a pensare a un iteratore come a riposo non su un oggetto, ma sul bordo poco prima.
Per le sottosequenze con inizio e fine, invece di numerare il
oggetti, ho mentalmente numerato i bordi tra gli oggetti. 0 è il bordo
prima del primo oggetto. Il startIt
è il margine da cui inizio; il
stopIt
è il limite su cui mi sto fermando.
La seguente immagine è adattata da Introduzione informale a Python .
item 0 1 2 3 4 5
+---+---+---+---+---+---+
| P | y | t | h | o | n |
+---+---+---+---+---+---+
iterator 0 1 2 3 4 5 6
Quindi startIt = 2
e stopIt = 5
portano a t, h, o
.
Perché l'indicizzazione basata sui bordi (indicizzazione dell'intervallo aperto a destra) è piacevole
Ottieni alcune proprietà davvero belle:
- numero di elementi in una sottosequenza:
n = stop - start
- Per creare sottosequenze adiacenti,
stop of one == start of the next.
Esempi di seguito. Sto usando la sintassi di Python qui sotto perché non conosco il C ++.
Se qualcuno è disposto a tradurre questa sezione in C ++ (Non disturbare
lasciando il Python), sarò molto grato. Ad ogni modo, la notazione è
non è importante: leggi [start:stop]
come startIt
e stopIt
.
Questo è il contenitore che utilizzeremo
my_container = [ 'a', 'b', 'c', 'd' ]
## edges ^ ^ ^ ^ ^
## 0 1 2 3 4
Accedi alle sottosequenze tagliando come c[start:stop]
- ottieni
tutto tra i bordi 1 e 3.
my_container[1:3] == ['b', 'c']
Per ottenere una porzione di lunghezza 3, mi assicuro stop = start + 3
my_container[1:4] == ['b', 'c', 'd']
# or do stop - start to find out how long the slice is:
4 - 1 == 3 # 3 elements in this slice.
Voglio che una sezione inizi dove finisce la fetta precedente. Quindi, ho lasciato il primo
slice end on edge x e il secondo inizia sul bordo x . In questo modo io
dividere in modo pulito il contenitore in due.
my_container[0:3] == ['a', 'b', 'c']
my_container[3:4] == ['d']
Commento conclusivo
Leggi il saggio di Edsger W. Dijkstra in
risposta di manlio .
È meno di 700 parole, con un pensiero cristallino e ugualmente chiaro
scrittura a mano (e un collegamento a una versione html all'interno).