2010-04-16 4 views
3

C++에서 2 차원 문자열과 같은 것을 쓰고 싶습니다. 오류를 컴파일C++의 2 차원 문자열

vector< vector<string> > table; 
     int m,n,i,j; 
     string s; 
     cin>>n>>m; 
     for(i=0;i<n;i++) { 
       for(j=0;j<m;j++) { 
         cin>>s; 
         table[i][j] = s; 
       } 
     } 
     cout << "\n\n\n\n"; 
     for(i=0;i<n;i++) { 
       for(j=0;j<m;j++) { 
         cout<<table[i][j]<<" "; 
       } 
       cout<<"\n"; 
     } 

,하지만 난 같은 입력을 입력 할 때 : 나는 함께 시도하지

10 20 
.....#.............. 
.....#.............. 
.....#.............. 
.....#.............. 
######.............. 
.......###.......... 
.......#.#.......... 
.......###...####### 
.............#.....# 
.............####### 

그것은 나에게 세그먼트 오류를 ​​제공합니다. 왜 ? 뭐가 문제 야 ? 어떻게 제대로 작동해야합니까? 고맙습니다.

+0

문제가 발생한 줄을 찾는 한 가지 방법은 'vector :: operator []'대신'vector :: at (size_t)'를 사용하는 것입니다. 예외가 발생하면 예외가 발생합니다. 유효하지 않은 색인이 액세스됩니다. –

답변

7

질문은 데이터 구조가 각각 문자 인 n 줄 집합이라는 것을 암시하는 것처럼 보입니다. 이것에 대해 생각할 수있는 두 가지 방법이 있습니다 - nxm char 매트릭스 또는 nm- 문자 벡터 (문자열은 비슷하지만 vector<char>과 동일하지 않습니다).

는 그래서, 당신이 중 하나 char의의 vectorvector의의, 또는 단지 vectorstring의의를 원하는 당신이 vectorstring의의의 vector의 원하지 않는 것 같다.

table [i] [j] 또는 (약간 더 관용적 인 C++를 사용하기 전에 적절한 크기의 공간을 할당해야하지만이 경우에는 필요하지 않습니다. mn은 미리 알고 있습니다. 끝에 추가하려면 push_back.

참고 또한 cin>>s는 (내 생각에 대처하기 vector<string> 솔루션은 조금 더 쉽게) stdin에서 전체 라인을 읽습니다.

+0

반드시 각 셀에 수식이있는 스프레드 시트의 표/표를 고려하십시오. 그것은 문자열의 배열입니다. –

+0

하지만이 경우 (즉, 샘플 입력에서) 질문자는 2 차원 배열의 문자를 원한다고합니다. –

+0

문제는 그가 '벡터 <벡터 >'으로 도망 갈 수 없다는 것이 아닙니다. 문제의 일부는'cin >> s '가 한 번에 한 줄씩 읽히는 것입니다. 그가 segfaulting 아니었다면, 그는 모든 것을 채우기 전에 입력이 부족합니다. –

1

아직 삽입하지 않은 벡터를 색인화하는 것은 오류입니다.

std::vector<int> v; 
v[0] = 3;//bad, v[0] doesn't exist yet 

수정 :

std::vector<int> v; 
v.push_back(3); 
int x = v[0];//ok 

을하지만 귀하의 경우 먼저 벡터에 삽입 된 후 다른 벡터에 전체 벡터를 밀어

그래서 더 쉬운 예를 복용.

3

vector에 새로운 내용을 삽입 할 때 인덱스로 할당 할 수는 없으므로 push_back 방법 또는 이와 유사한 것을 사용해야합니다.

0

v.insert(v.end(), s)을 사용해야하는 요소를 추가하려면 요소 벡터를 만들어야합니다. finnaly (전체 행 데이터가있는 경우). 당신이 작성해야합니다 tables.insert(tables.end(), v)

1

나는 vector<vector<char> > 귀하의 목적에 더 적합하다고 생각합니다.

1

당신은 vector가 아직 비어 있고 아마 할 수 없습니다. 예를 들어를 사용하여 값을 추가 할 수 있습니다. push_back() 또는 적당한 크기를 초기화하기 : 다른 사람이 생각 언급

std::cin >> n >> m; 
typedef std::vector<std::string> StringVec; 
std::vector<StringVec> table(n, StringVec(m)); 

으로 std::string 당신이 정말로 필요하지 않을 수 있습니다.

vector< vector<char> > table(ROW_COUNT, vector<char>(COLUMN_COUNT, '.')); 

COLUMN_COUNT. 포함 번째 인수로서 전달 벡터 ROW_COUNT 사본을 포함하는 벡터를 초기화 할 것이다 :

1

vector 클래스이므로 크기와 요소 걸리는 ctor에있다.

0

string s; cin>>s; 대신 char s; cin.get(s);을 사용해야합니다. cin>>s은 한 번에 전체 단어 (샘플에서 전체 줄과 동일 함)를 읽습니다.

또한 각 배열의 크기를 올바르게 지정하려면 작업을 수행해야합니다. 귀하의 코드에서 0 개의 벡터 0 벡터의 벡터가 있습니다. 예 :

vector< vector<string> > table; 
int m,n,i,j; 
char s; 
cin>>n>>m; 
for(i=0;i<n;i++) { 
    table.push_back(vector<string>()); 
     for(j=0;j<m;j++) { 
       cin.get(s); 
       table[i].push_back(string(1,s)); 
     } 
} 
cout << "\n\n\n\n"; 
for(i=0;i<n;i++) { 
     for(j=0;j<m;j++) { 
       cout<<table[i][j]<<" "; 
     } 
     cout<<"\n"; 
}