2013-05-17 13 views
13

devo tale codice:C++ stl ciò fa base() fare

vector <int> v; 
for (int i=0; i<5; i++) 
     v.push_back(i); 
v.erase(find(v.rbegin(), v.rend(),2).base()); 

Questo codice elimina il primo elemento di un vettore v dopo la prima rilevato 2 (nel vettore rimanere: 0 1 2 4). Cosa fa .base() fare qui?

+0

Forse dovresti leggere questo: http://www.cplusplus.com/reference/iterator/reverse_iterator/base/ – JBL

risposta

22

base() converte un iteratore inverso in avanti corrispondente iteratore. Tuttavia, nonostante la sua semplicità, questa corrispondenza non è così banale come potrebbe sembrare una cosa.

Quando un iteratore punti inversa a un elemento, esso dereference quella precedente, così l'elemento it fisicamente punti ae l'elemento che logicamente indica sono diversi. Nel diagramma seguente, i è un iteratore in avanti, e ri è un iteratore inverso costruita i:

       i, *i 
          | 
    -  0  1  2  3  4  - 
         |  | 
         *ri ri 

Quindi se ri logicamente punti all'elemento 2, indica fisicamente elemento 3. Pertanto, quando viene convertito in un iteratore di inoltro, l'iteratore risultante punterà all'elemento 3, che è quello che viene rimosso nell'esempio.

Il seguente piccolo programma illustra il comportamento precedente:

#include <iostream> 
#include <vector> 
#include <iterator> 
#include <algorithm> 

int main(int argc, char *argv[]) 
{ 
    std::vector<int> v { 0, 1, 2, 3, 4 }; 
    auto i = find(begin(v), end(v), 2); 

    std::cout << *i << std::endl; // PRINTS 2 

    std::reverse_iterator<decltype(i)> ri(i); 
    std::cout << *ri << std::endl; // PRINTS 1 
} 

Ecco un live example.

8

base() restituisce l'iteratore di base sottostante.

La base iteratore si riferisce all'elemento che si trova accanto all'elemento il reverse_iterator sta puntando al. Questo è std::reverse_iterator(it).base() == std::next(it).

Ulteriori informazioni su reverse_iteratorhere.

enter image description here