Newsgroup: it.comp.lang.c++
Titolo: Operazioni tra iteratori (somme e sottrazioni)

č legale fare somme e sottrazioni tra operatori? e se sě il risultato
č quello che mi aspetto?
mi spiego:
se ho un vettore di interi e uso find per cercare un intero, facendo
la sottrazione tra l'iteratore restituito da find e il begin() del
vettore ottengo la posizione dell'elemento trovato?
-- 
]\/[ad]\/[age
"Un Maestro insegue semplicemente la sua visione di Eccellenza in
qualunque cosa sta facendo e lascia agli altri decidere se sta 
lavorando o giocando. A lui sembra sempre di fare entrambe." - Anonimo

 vettore ottengo la posizione dell'elemento trovato?
find ti restituisce gia' da solo l'iteratore che punta all' elemento
trovato.
Che ti serve fare la sottrazione con begin?
Comunque le sottrazioni sono legali per i contenitri ad accesso casuale
e ti danno la distanza tra i due elementi del contenitore, anche se per
rigore andrebbe usata  distance()
esempio:
#include <vector>
#include <list>
#include <iostream>
int main()
{
   std::vector<int> v1(10);
   std::vector<int>::iterator IterV;
   std::list<int> l1(10);
   std::list<int>::iterator IterL;
    // ciclo sul vector usando operator-()
   for( IterV = v1.begin(); IterV != v1.end(); ++IterV)
   {
        std::cout << (IterV - v1.begin()) << std::endl;
   }
   std::cout << std::endl;
    // ciclo sulla list usando distance()
   for( IterL = l1.begin(); IterL != l1.end(); ++IterL)
   {
        std::cout << std::distance(IterL, l1.begin()) << std::endl;
   }
}

 vettore ottengo la posizione dell'elemento trovato?
Se consideriamo l'iteratore come l'astrazione di un puntatore ( o se vuoi 
il puntatore come caso speciale di un iteratore ), in generale la risposta 
è no.
Può essere che per alcuni tipi di container ( in particolare i vector ) e 
implementazione a volte questo sia vero.
Con il gcc 3.0.1 torna il risultato da te aspettato.

 è quello che mi aspetto?
Ovviamente volevi scrivere: "tra iteratori".
Lo standard alla sezione 24.1.2 dice che un iteratore per essere
considerato tale deve avere "anche" la semantica di un puntatore.
Ciao
Gaetano.
-- 
Posted from 
nts-03.mm.eutelsat.org
 [194.214.173.15] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

considerato tale deve avere "anche" la semantica di un puntatore.
Solo una parte della semantica dei puntatori, in realtà.
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

 Con il gcc 3.0.1 torna il risultato da te aspettato.
Piů precisamente con gli iteratori che soddisfano i requirement di
random-access-iterator la cosa č valida. Per gli altri no.


 considerato tale deve avere "anche" la semantica di un puntatore.
non ho lo standard ma immagino che con "semantica di un puntatore" 
intenda il supporto agli operatori -> e *.
Gli unici iteratori che supportanogli operatori + e - sono quelli ad 
accesso casuale. Per gli altri occorre utilizzare le funzioni 
std::distance (che equivale a operator-) e std::advance (che equivale a 
operator+=).
ciao Anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it