2013-09-07 3 views
1

는 I는 벡터 내 벡터를 정의함에 :벡터를 벡터 내에서 반복하는 방법은 무엇입니까?

std::vector<std::vector<myObj>> some_list(list_size); 

some_list의 요소를 가지고, 일부가되지 않은 3 개 요소가 그렇게 일부 항목의 크기가 3 (4)와 그있는 사이즈를 예를 들면 4 등을 :

some_list[14] {size=0} 

하는 시점 이후 다음 모든 항목의 크기가 0이 있습니다

some_list[0] {size=3} 
some_list[1] {size=4} 

하지만, 어떤 점에서, 0 요소와 빈 항목이

게다가.

내 벡터 크기를 조정하려고하므로 이러한 항목을 제외하고 요소가있는 항목 만 남습니다. 그러나 웬일인지 나는 그것을 작동하게 할 수 없다. 여기에 내가 가진 무엇을 :

int snum = 0; 

     for (std::vector<std::vector<myObj>>::iterator a_it = a_list.begin(); 
      a_it != a_list.end(); a_it++) { 
       while (a_it->size() != 0) { 
        snum++; 
       } 
     } 

a_list.resize(snum); 

답변

2

가 첫 번째 빈 한 후 모든 항목도 비어있을 것입니다, std::find_if을 사용하여 첫 번째 빈 요소에 반복기를 가져온 다음 std::vector::erase :

을 사용할 수 있습니다.

또는, 당신은 C++ 11 지원이있는 경우, 당신은 람다 사용할 수 있습니다 : 나는 v을 사용

v.erase(std::find_if(v.begin(), 
         v.end(), 
         [](const std::vector<myObj>& v){ return v.empty(); }), 
     v.end()); 

some_list입니다.

또한 빈 항목이 모두 끝에 있지 않은 경우 적절한 기능이있는 erase remove idiom을 사용하여 요소가없는 항목을 제거 할 수 있습니다.

v.erase(std::remove_if(v.begin(), v.end(), is_empty), v.end()); 
+0

감사합니다. 정말 알려주고있었습니다. – Napalidon

4

이 줄 :

while (a_it->size() != 0) { 

아마 읽어야 확신하는 경우

if (a_it->size() != 0) { 
+0

네, 고맙습니다. – Napalidon

+1

'if (! a_it-> empty()) {'를 사용하여 더 자세한 설명을 할 수도 있습니다. 단지 코드의 실제 버그를 지적하기 위해 그 부분을 망칠 필요가 없습니다. 문제가 해결되면 대답을 수락하는 것을 잊지 마십시오.) –

0

먼저 빈 요소를 제거해야합니다. 당신은 준비가 만든 알고리즘으로 수행 할 수 있습니다

#include <algorithm> 
#include <functional> 

some_list.erase(std::remove_if(some_list.begin(), some_list.end(), 
           std::mem_fn(&std::vector<myObj>::empty), 
       some_list.end()); 

을 그럼 당신은 크기를 조정할 수 : some_list.resize(N). 실제로 새로운 요소를 비우려면 erase 단계를 건너 뛰고 remove_if 부분 만 수행하면됩니다.

관련 문제