2014-10-11 17 views
6

C'è un modo per sintatticamente abbreviare/semplificare le dichiarazioni degli iteratori in C++. Normalmente avrei:Più facile istanza di iterazione C++ STL

vector<pair<string, int> > v; 
vector<pair<string, int> >::iterator i; 

speravo in qualcosa di magico che sarebbe:

vector<pair<string, int> > v; 
magic v::iterator i; 
+0

Se si utilizza C++ 11, controllare l'identificatore 'auto'. – Macmade

+1

Se stai usando C++ 11, dì semplicemente "auto i (v.begin());" e il compilatore dedurrà il tipo corretto per "i". http://en.cppreference.com/w/cpp/language/auto – dgnuff

risposta

5

In C++ 11, hai tre opzioni:

1. Digitare l'istanza del vettore

typedef std::vector<std::pair<std::string, int>> Vp; 
Vp v; 
Vp::iterator i; 

2. Usare decltype

std::vector<std::pair<std::string, int>> v; 
decltype(v)::iterator i; 

3. Utilizzare auto

std::vector<std::pair<std::string, int>> v; 
auto i = v.begin(); 

direi che la terza opzione è la più comune, uso idiomatico, ma tutti sono valido, e la prima opzione funziona anche in C++ 98.

+0

Il decltype era la magia che stavo cercando. Peccato solo per C++ 11. – Waslap

7

Basta usare typedef per aliasing tuo vector<pair<string, int> >

typedef vector<pair<string, int> > Vp; // vector of pair 

E poi,

Vp v; 

Vp::iterator i; 
0

C++ 11:

using v = vector<pair<string, int> >; 
using i = v::iterator; 

Magic:

v _v; 
i _i{ _v.begin() }; 
2

Io uso typedef molto:

// vector of strings 
typedef std::vector<std::string> str_vec; 

// iterator 
typedef str_vec::iterator str_vec_iter; 

// constant iterator 
typedef str_vec::const_iterator str_vec_citer; 

// reverse iterator 
typedef str_vec::reverse_iterator str_vec_riter; 

// constant reverse iterator 
typedef str_vec::const_reverse_iterator str_vec_criter 

int main() 
{ 
    str_vec v = {"a", "b", "c"}; 

    // writable iteration 
    for(str_vec_iter i = v.begin(); i != v.end(); ++i) 
     i->append("!"); 

    // constant iteration 
    for(str_vec_citer i = v.begin(); i != v.end(); ++i) 
     std::cout << *i << '\n'; 

    // constant reverse iteration 
    for(str_vec_criter i = v.rbegin(); i != v.rend(); ++i) 
     std::cout << *i << '\n'; 
} 

Alcuni contenitori sono così comuni che ho loro typedef in File di intestazione personali che uso sempre (nomi assegnati in modo naturale).

Ma dal momento che C++ 11 non è così importante a causa della parola chiave auto che deduce il tipo per voi:

for(auto&& i: v) 
    std::cout << i << '\n'; 
2

In C++ 11 si può scrivere:

decltype(v)::iterator