2014-10-11 11 views
6

क्या सी ++ में पुनरावर्तक घोषणाओं को वाक्यबद्ध रूप से छोटा/सरल बनाने का कोई तरीका है। आम तौर पर मैं करूंगा:आसान सी ++ एसटीएल इटरेटर तत्काल

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

मैं कुछ जादू है कि होगा के लिए उम्मीद की गई थी:

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

यदि सी ++ 11 का उपयोग करते हैं, तो 'ऑटो' विनिर्देशक की जांच करें। – Macmade

+1

यदि आप सी ++ 11 का उपयोग कर रहे हैं, तो बस 'ऑटो i (v.begin()) कहें;' और कंपाइलर 'i' के लिए सही प्रकार का अनुमान लगाएगा। http://en.cppreference.com/w/cpp/language/auto – dgnuff

उत्तर

5

में सी ++ 11, आप तीन विकल्प हैं:

1. वेक्टर इन्स्टेन्शियशन typedef

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

2. उपयोग decltype

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

3. उपयोग auto

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

मैं कहेंगे तीसरा विकल्प सबसे आम, मुहावरेदार उपयोग है, लेकिन सभी कर रहे हैं मान्य, और पहला विकल्प सी ++ 98 में भी काम करता है।

+0

अस्वीकार वह जादू था जिसे मैं ढूंढ रहा था। यद्यपि केवल सी ++ 11 में करुणा। – Waslap

7

बस अपने vector<pair<string, int> >

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

और फिर aliasing के लिए typedef उपयोग करते हैं,

Vp v; 

Vp::iterator i; 
0

सी ++ 11:

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

जादू:

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

कुछ कंटेनरों इतना आम मैं में अपने typedefs है कि कर रहे हैं:

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

मैं का उपयोग एक बहुत typedefs व्यक्तिगत शीर्षलेख फ़ाइलें जिन्हें मैं हर समय उपयोग करता हूं (स्वाभाविक रूप से नामित)।

लेकिन सी ++ 11 के बाद से बहुत महत्वपूर्ण नहीं है क्योंकि auto कीवर्ड के लिए आप के लिए प्रकार deduces की:

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

सी ++ 11 में आप लिख सकते हैं:

decltype(v)::iterator 
संबंधित मुद्दे