vector
s 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
이 유효한 모든 인덱스를 확인하고 다음 또한 j
이 m[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;
(기능 없음으로, 전혀 기능하지 않고 같은 효과를 얻을 수 않는 경우, 이후 오히려 무의미 호출, 값으로 전달할 복사본 없음 등).