2014-10-11 16 views
6

Gibt es eine Möglichkeit, Iterator-Deklarationen in C++ syntaktisch zu verkürzen/zu vereinfachen. Normalerweise würde ich:Leichtere Instanziierung von C++ STL-Iteratoren

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

Ich war für einige Magie der Hoffnung, das würde:

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

Wenn Sie C++ 11 verwenden, überprüfen Sie den 'auto'-Spezifizierer. – Macmade

+1

Wenn Sie C++ 11 verwenden, sagen Sie einfach "auto i (v.begin());" und der Compiler wird den richtigen Typ für "i" ableiten. http://en.cppreference.com/w/cpp/language/auto – dgnuff

Antwort

5

In C++ 11, haben Sie drei Möglichkeiten:

1. Typedef den Vektor Instanziierung

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

2. Verwenden decltype

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

3. Verwenden auto

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

ich die dritte Option würde sagen, ist die häufigste, idiomatischen Sprachgebrauch, aber alle sind gültig, und die erste Option funktioniert auch in C++ 98.

+0

Der Dekltyp war die Magie, nach der ich suchte. Schade nur in C++ 11 obwohl. – Waslap

7

einfach typedef verwenden für Ihre vector<pair<string, int> >

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

Aliasing Und dann

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

I verwenden typedefs viel:

// 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'; 
} 

Bestimmte Container sind so verbreitet, dass ich ihre typedefs haben in persönliche Header-Dateien, die ich die ganze Zeit benutze (Namespaced natürlich).

Aber seit 11 C++ ist es nicht so wichtig, weil der auto Schlüsselwort, das den Typ für Sie folgert:

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

In C++ 11 können Sie schreiben:

decltype(v)::iterator 
Verwandte Themen