1
vector< vector<int> > resizeVector(vector< vector<int> > m) 
{ 
    vector< vector<int> > newMatrix; 
    int i,j; 

    for (i = 0; i < m[i].size(); i++) 
    { 
     for(j = 0; j < m[j].size(); j++) 
     { 
      newMatrix[i][j] = m[i][j]; 
     } 
    } 
    return (newMatrix); 
} 

나는 행렬 조작을 많이 할 프로그램을 만들고 있는데,이 섹션은 충돌하고 정확히 이유는 모르겠다. 나는 줄에 그것을 좁혔다 :벡터 할당 충돌, 확실하지 않은 이유

newMatrix[i][j] = m[i][j]; 

그것은 여기에서 부서지고, 나는 확실하지 않다.

답변

0

수표가 잘못되었습니다. 대신 당신은 먼저 크기를 설정하지 않고 새 newMatrix에 할당하고

for (i = 0; i < m.size(); i++)  // m.size() gives the number of rows 
{ 
    for(j = 0; j < m[i].size(); j++) // m[i].size() gives the number of columns in the row 
0

해야한다. 빈 값으로 기본 설정되며 이 지정되면에 할당하려고하면 정의되지 않은 동작이 발생합니다.

새로운 크기로 전달하지 않으므로 수행하려는 작업을 정확히 알기가 어렵습니다. 그래서 그 문제를 해결하는 방법에 대한 더 분명한 조언이 없습니다.

1

@Saurav 게시 내용 외에도 newMatrix은 비어 있으므로 newMatrix[i][j]에 값을 할당 할 수 없습니다. 당신은 주어진 크기와 벡터를 초기화하여이 문제를 해결할 수 있습니다

vector< vector<int> > resizeVector(vector< vector<int> > m) 
{ 
    vector< vector<int> > newMatrix(m.size()); 
    int i,j; 

    for (i = 0; i < m.size(); i++) 
    { 
     newMatrix[i].resize(m[i].size()); 
     for(j = 0; j < m[i].size(); j++) 
     { 
      newMatrix[i][j] = m[i][j]; 
     } 
    } 
    return (newMatrix); 
} 

을위한 - 루프 우리가 newMatrix을 초기화하기 전에 (때문에 기본 생성자에 벡터가 비어) 그것의 내부 m.size() 많은 빈 벡터를 가지고. 바깥 쪽 for-loop를 반복 할 때마다 resize 멤버 함수를 사용하여 newMatrix에있는 각 벡터의 크기가 올바른지 확인합니다. 당신이 벡터의 사본을 원하는 경우

주 당신은 단순히 쓸 수 :

vector< vector<int> > newMatrix(m); 
0

당신이 벡터의 벡터를 할당 할 경우, 당신은 거기에 당신 인덱스 전에 매트릭스에 대한 메모리를 할당해야 . 그래서 당신은

newMatrix.resize(size); 
for (int i = 0; i < size; ++i) { 
    newMatrix[i].resize(size); 
} 

같은 것을 사용해야 할 것입니다 또는 당신은 사전에 메모리를 할당하지 않고 벡터 값을 추가하기() 벡터 방법을 .push_back 사용할 수 있습니다.

0

vectors operator[] 경계 검사없이 지정된 요소에 대한 참조를 반환합니다.

즉, 벡터의 크기를 마술처럼 바꾸거나 요소가 존재하는지 확인하기 위해 다른 작업을 수행하지 않습니다. 요소가 존재하지 않으면 결과는 정의되지 않은 동작입니다. 즉, 어떤 일이 발생할 수 있음을 의미합니다. 실제로, 프로그램이 종종 충돌을 일으키는 유효하지 않은 메모리 위치에 액세스하게 만듭니다.

위의 내용은 간단한 경우에도 마찬가지입니다. vector<int>. vector<vector<int> > (vector<vector<int> >의 각 요소는 vector<int>입니다)로 작업하여 문제를 해결했습니다.

함수는 실제로 정의되지 않은 동작을 유발할 수있는 횟수만큼 조금 아슬 아슬합니다. 성명 newMatrix[i][j] = m[i][j]에 충돌이 발생했지만 그 전에 실제로 정의되지 않은 동작이 발생할 가능성이 있습니다.

m.size() (코드에서 확인하지 않음)의 값이 0 인 경우 외부 루프에서 m[i]이 존재하지 않습니다. m.size()이 0이면 m[i] (m.operator[](i))의 평가에 정의되지 않은 동작이 발생합니다.

은 본질적으로, 당신은 m[i]을 평가하기 전에 i이 유효한 모든 인덱스를 확인하고 다음 또한 jm[i][j]을 평가하기 전에 m[i]의 유효한 인덱스가 있는지 확인해야합니다. 그런 다음 newMatrix에 대해 동일하게 수행하십시오. 귀하의 코드는 이것에 전혀 영향을 미치지 않습니다. 함수의 더 정확한 표현은 것입니다, 여러분의 코드가 실제로 벡터가 이미 제공 기능을 다시하세요 지금

vector< vector<int> > resizeVector(vector< vector<int> > m) 
{ 
    vector< vector<int> > newMatrix; 
    int i,j; 

    newMatrix.resize(m.size()); // necessary to ensure we can access newMatrix[i] in the loop below 

    for (i = 0; i < m.size(); i++)  // ensure i is a valid index of m 
    { 
     // newMatrix[i].size() is still zero, so we need to resize for use in the inner loop 

     newMatrix[i].resize(m[i].size()); 

     for(j = 0; j < m[i].size(); j++) // ensure j is a valid index of m[i] 
     { 
      newMatrix[i][j] = m[i][j]; 
     } 
    } 
    return (newMatrix); 
} 

입니다 (의도를 가정하는 것은 m의 복사본을 만드는 것입니다). 그래서 우리는 잘못된 이름입니다 (나는 그것을 수정 한 것처럼) 아주 간단하게이 함수를 의미

vector< vector<int> > resizeVector(vector< vector<int> > m) 
{ 
     return m; 
} 

vector< vector<int> > resizeVector(vector< vector<int> > m) 
{ 
     vector< vector<int> > newMatrix(m); 
     return newMatrix; 
} 

심지어와

와 함수의 본문을 대체 할 수 - 그것은 크기를 조정하지 않습니다 아무것도. 사실, 호출자가이

x = resizeVector(y); 

는 단순히 또한 더 효율적입니다

x = y; 

(기능 없음으로, 전혀 기능하지 않고 같은 효과를 얻을 수 않는 경우, 이후 오히려 무의미 호출, 값으로 전달할 복사본 없음 등).

관련 문제