2016-06-30 44 views
7

Mi è stata fatta questa domanda che non so davvero perché.In C++, perché non possiamo confrontare gli iteratori usando> e <?

Se si dispone di un puntatore int * x;
È possibile confrontare i puntatori con > e < perché sta per la cosa posizione memoria come 0x0000 0x0004 0x0008, ecc So iteratori e puntatori sono diversi, ma si comportano in modo molto simile.

Ad esempio:

vector<int> myVector; 

for(int i = 1; i < 101; i++) 
{ 
    myVector.push_back(i); 
} 

vector<int>::iterator it = myVector.begin(); 
while(it != myVector.end()) //Why can't we write it < myVector.end() 
{ 
    cout << *it << endl; 
    it++; 
} 

Perché non possiamo scriverlo < myVector.end() nella dichiarazione while? So che ha a che fare senza sovraccaricare in STL. Tuttavia, scrivere &*it < &*myVector.end() funziona perché ottiene la posizione di memoria che rivela dire 0x0004 0x0008, ecc.

Perché è questo?

+1

[Cosa intendi?] (Http: //coliru.stacked-crooked.com/a/4b5dfc7353b93dc6) – LogicStuff

+0

Relazionato anche: [Perché è meglio usare '! = "di' <'in un loop vettoriale? (C++)] (http://stackoverflow.com/questions/871666/why-is -i-meglio-da-usare-di-in-un-vettore-ciclo-c) – iammilind

+0

Attenzione, puoi usare '<' su due puntatori _ allo stesso array_, ma non su puntatori non collegati – MSalters

risposta

7

operator< e operator> possono essere utilizzati solo con RandomAccessIterator. Ma operator!= può anche essere utilizzato con InputIterator, ForwardIterator e BidirectionalIterator. Per il codice di esempio, it != myVector.end() e it < myVector.end() hanno lo stesso effetto, ma il primo è più generale, quindi il codice funziona anche con altri iteratori (ad esempio iteratori di std::list o std::map ecc.).

BTW: Il codice di esempio sarà bene usare operator< o operator>, dal momento che l'iteratore di std::vector è RandomAccessIterator.

+0

Va notato, tuttavia, che per essere comparabili, entrambi gli iteratori devono essere nello stesso dominio (iterando sullo stesso vettore o qualsiasi altra classe sottostante) – Aconcagua

+0

Ho provato effettivamente con g ++ insieme a -Wall -Wextra -std = C++ 11. Non si compila quando lo scrivi Thenewstockton

+0

@ user4099855 Qual è il messaggio di errore? Hai controllato il commento di LogicStuff? – songyuanyao

4

std::vector::iterator è un iteratore di accesso casuale e puoi certamente confrontarli con < e >.

Tuttavia, solo gli iteratori di accesso casuale possono essere confrontati utilizzando qualsiasi valore diverso da == e !=. Gli iteratori bidirezionali, avanti e input definiscono solo gli operatori di confronto di uguaglianza/diseguaglianza.

A , ad esempio è un iteratore che punta a un membro non specificato di std::list. In questo caso, non c'è alcun significato per nessun altro tipo di confronto.

+0

Sì, corretto –

0

Il problema è che < e >non può essere sempre utilizzato con iteratori, in quanto solo alcuni tipi di iteratori supportano tali operazioni (ovvero iteratori ad accesso casuale e simili). D'altra parte, operazioni di confronto come != sono sempre disponibili.

Ora, perché preoccuparsi di utilizzare < e > se != ha lo stesso effetto e funziona sempre?


Supponiamo di avere un po 'di codice generico:

template <class It> 
void foo(It begin, It end) 
{ 
    while (--end != begin) 
     apply(*begin); 

} 

Il codice verrà compilato per i puntatori, per esempio, ma non per myList.begin().

+0

Qualche motivo di downvoting? – edmz

+0

La domanda era * 'Perché ...?' *, Stai solo dando un esempio, non il motivo (anche se downvote non era mio ...). – Aconcagua

+0

@Aconcagua Bene, penso che la ragione sia abbastanza chiara (_ "solo alcuni tipi di iteratori supportano tali operazioni" _) e l'esempio mostra un possibile scenario per il problema. – edmz

Problemi correlati