2017-02-10 6 views
1

std::map<string,int>std::vector<int>을 반복하는 방법은 for 루프를 사용 하시겠습니까?std :: map을 반복하는 방법 <string,int> 및 std :: vector <int> for for single loop?

나는 this questions을 본 적이 있지만 내 문제를 해결할 수 없습니다.

내가 좋아하는 것을 시도하고이

map<string,int> data; 
data["Shravan"] = 1; 
data["Mama"] = 2; 
data["Sa1"] = 3; 
data["Jhandu"] = 4; 

vector<int> values = {1,2,3,4}; 

for(const auto& it1: data,it2 : values) { 
    // Do something 
} 

편집 : 나는 하나 하나를 통해 갈 수 없습니다. 왜냐하면 동일한 기능에서 std::map의 키와 std::vector의 값을 사용하기 때문입니다. 어느 쪽이 for 루프라고합니다.

동일한 크기의 컨테이너.

+0

왜 ?? 그리고 어떤 행동을 원하십니까? 하나의 컨테이너를 통과 한 다음 다른 컨테이너를 통과합니까? 아니면 인터리브 할 수 있습니까? – BoBTFish

+0

은 http://www.cplusplus.com/reference/map/map/begin/ 및 http://www.cplusplus.com/reference/map/map/end/에서 살펴볼 수 있지만, 이것은 좋은 습관이 아닙니다 ... 비슷한 기능이 벡터에도 적용됩니다. – Kupto

+0

@BoBTFish : 하나씩 진행할 수 없습니다. 왜냐하면 나는'std :: map'의 키와'std :: vector'의 값을 같은 함수에서 사용하기 때문입니다. – Shravan40

답변

3

같은 길이 모두, 같은 사용이 알고있는 경우 :

auto vit = begin(value); 
auto mit = begin(data); 
for (; vit != end(value); ++mit, ++vit) { 
    // Use mit and vit 
} 
+0

코드가 컴파일되지 않습니다. 'mit'는 _const_에 대한 참조이고'++ '연산자는 const가 아닙니다. –

+0

적절하게 수정 된 답변 –

1

boost::zip_iterator이 응답 어떻게 할 - 동안 약 https://stackoverflow.com/a/8513803/2210478

+0

@MikeMB 네, 맞습니다. 내가 제안한 코드가 잘못되었습니다. 나는 그것을 제거했습니다. 어쩌면 OP가 zip_iterator를 여전히 확인할 수 있습니다. –

+1

자, 아래 표를 제거했습니다. 사용 예제를 추가하면 upvote가 생깁니다. – MikeMB

2

에서 논의 고려해을? 컨테이너가 비어 있지 않으면 제공됩니다.

auto iv = std::begin(value); 
auto id = std::begin(data); 

do { 
    // Use those iterators 
} while(++iv != std::end(value) && ++id != std::end(data)) 

아니면 너무 빈 컨테이너를 처리하려는 경우 while를 사용합니다.

auto iv = std::begin(value); 
auto id = std::begin(data); 

while(iv != std::end(value) && id != std::end(data)) { 
    // Use those iterators 

    iv++; id++; 
} 
+3

간단한 'while'은 빈 컨테이너를 처리합니다. – Jarod42

+0

@ Jarod42 예, 코드가 비어있는 경우 실패합니다. 사전 조건으로 추가했습니다 :) –

1

당신은 mapvector 모두를 반복하고 해당 컨테이너의 마지막에 대해 반복자를 확인해야 할 수 있습니다.

auto map_iter = data.begin(); 
auto vec_iter = value.begin(); 
for (; map_iter != data.end() && vec_iter != value.end(); 
     ++map_iter, ++vec_iter) { 
    // Use map_iter and vec_iter 
}