2014-10-11 2 views
6

C++에서 반복자 선언을 구문 적으로 단축/단순화하는 방법이 있습니까? 일반적으로 나는 것 :더 쉬운 C++ STL 반복자 인스턴스화

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

나는 것 몇 가지 마법을 기대했다 :

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

C++ 11을 사용하는 경우 'auto'지정자를 확인하십시오. – Macmade

+1

C++ 11을 사용한다면'auto i (v.begin());'이라고 말하면 컴파일러는'i'에 대해 올바른 타입을 추론합니다. http://en.cppreference.com/w/cpp/language/auto – dgnuff

답변

5

에서 C++ 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(); 

나는 세 번째 옵션은 가장 일반적인, 관용적 사용 말하고 싶지만, 모두가 유효하며 첫 번째 옵션은 C++ 98에서도 작동합니다.

+0

decltype은 제가 찾고있는 마법이었습니다. 오직 C++ 11에서의 동정. – Waslap

7

간단하게 다음 vector<pair<string, int> >

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

그리고 별명에 대한 typedef를 사용

Vp v; 

Vp::iterator i; 
0

C++ 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'; 
} 

특정 컨테이너 내가 그들의 형식 정의가 너무 일반적입니다 : 내가 사용하는

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

는 많은 타입 정의 내가 항상 사용하는 개인 헤더 파일들 (네임 스페이스는 자연스럽게).

그러나 C++ (11) 이래 그렇게 중요하지 않습니다 당신을 위해 유형을 추론 auto 키워드의 때문에 :

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

C++ 11에서 당신은 쓸 수 있습니다 :

decltype(v)::iterator