vector
s operator[]
返回對指定元素的引用,無邊界檢查。
這意味着它不會神奇地調整矢量大小或執行任何其他操作來確保元素存在。如果元素不存在,結果是未定義的行爲 - 這意味着任何事情都可能發生。實際上,它通常會導致程序訪問無效的內存位置,從而導致崩潰。
即使是簡單的vector<int>
也是如此。通過使用vector<vector<int> >
(vector<vector<int> >
的每個元素是vector<int>
),您的問題就複雜化了。
您的函數實際上可能會調用未定義行爲的次數令人驚歎。您碰巧在語句newMatrix[i][j] = m[i][j]
上發生崩潰,但未定義行爲的可能性實際上在此之前發生。
在外部循環中,如果m.size()
(您的代碼未檢查)的值爲零,則m[i]
將不存在。如果m.size()
爲零,則會導致m[i]
(如m.operator[](i)
)的評估具有未定義的行爲。
本質上講,你需要確保任何索引i
有效評估m[i]
前,然後還要確保j
是評估m[i][j]
之前的m[i]
有效的索引。然後爲newMatrix
做同樣的事情。你的代碼根本就沒有這個功能。你的函數的更正確的渲染(假設的意圖是建立m
副本)是
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);
}
現在的事情是,你的代碼實際上是再造功能,載體提供了。所以,我們可以很簡單地用
vector< vector<int> > resizeVector(vector< vector<int> > m)
{
vector< vector<int> > newMatrix(m);
return newMatrix;
}
甚至與
vector< vector<int> > resizeVector(vector< vector<int> > m)
{
return m;
}
這意味着你的函數替換函數體(因爲我已經修改了它)是名不副實的 - 它不調整任何東西。事實上,這是因爲毫無意義,如果來電者這
x = resizeVector(y);
它可以實現沒有你的功能相同的效果都沒有,只是作爲
x = y;
這也是更有效的(無功能調用,不創建副本以通過值傳遞等)。