2017-12-04 15 views
0

문자로 C++에서 2D 벡터를 채우려 고합니다. 그러나이 코드를 실행하면 한 줄 문자 (*..)로 끝납니다.C에서 2D 벡터 채우기

어떻게이 같은 2D 벡터를 채울 수 : 각 삽입 후 rowV을 취소해야 *.* .**

#include <iostream> 
#include <vector> 

int main() 
{ 
    std::vector<std::vector<char> > vec2D; 
    std::vector<char> rowV; 

    unsigned int row=2; 
    unsigned int col=3; 

    char c; 
    unsigned int temp=0; 

    while(temp!=col) 
    { 
     while(rowV.size()!=row) 
     { 
      std::cin>>c; 
      rowV.push_back(c); 
     } 
     vec2D.push_back(rowV); 
     ++temp; 
    } 

    return 0; 
} 
+0

재미 있고 관련성없는 재미있는 사실 :'std :: vector > '는 2D 벡터를 만들지 않습니다. 그것은 '벡터'의'벡터 '를 만들고, 이것은 약간의 불쾌한 성능 문제 (검색 용어 : "포인터 추적", "공간 지역성")을 가져옵니다. 은 잔인하게 이해하고 사용하기 쉽기 때문에 '벡터'의 '벡터'로 시작하십시오. 그러나 프로파일 링이 프로그램이 너무 느리다는 사실을 명심해야합니다. – user4581301

답변

1

, 그렇지 않으면 전체와 다른 문자가 추가되지 않습니다 것입니다. 또한 rowcol으로 바꿔야하며, 그렇지 않은 경우 2x3이 아닌 3x2 2D 벡터가 생성됩니다.

while(temp!=row) 
{ 
    while(rowV.size()!=col) 
    { 
     std::cin>>c; 
     rowV.push_back(c); 
    } 
    vec2D.push_back(rowV); 
    rowV.clear(); // clear after inserting 
    ++temp; 
} 
+1

다른 옵션은'std :: vector rowV;'의 정의를 while (temp! = row)'으로 옮기는 것입니다. 이것은 조금 더 느릴 수 있습니다 (프로그램은 반복적으로'rowV'를 파괴 할 수 있습니다). 그러나 rowV를보다 효과적으로 스코프하고 독자가 자신의 마음 속에'rowV'를 그것이 무엇이고 사용 방법을 구속하도록 도와줍니다. 가독성은 속도를 우선시 할 좋은 이유가 주어질 때까지 속도보다 우선합니다. – user4581301

+0

@ user4581301 예, 두 방법 모두 유효합니다. –