我撰寫了一個函式,它接收一個雙矩陣并向后查找零條目。如果它找到一個,則將該條目的值更改為-2.0并回傳true。否則回傳false。
這是代碼:
#include <iostream>
#include <vector>
bool remove1zero(std::vector<std::vector<double>> & matrix)
{
size_t dim = matrix.size();
for (size_t j = dim - 1; j >= 0; j--)
for (size_t i = dim - 1; i >= 0; i--)
if ((matrix[j])[i] == 0.0)
{
(matrix[j])[i] = -2.0;
return true;
}
return false;
}
int main()
{
std::vector<std::vector<double>> testMatrix(3);
testMatrix[0] = std::vector<double> {-2.0, -2.0, 3.0};
testMatrix[1] = std::vector<double> {-2.0, -1.0, 3.0};
testMatrix[2] = std::vector<double> {2.0, 2.0, -1.0};
std::cout << remove1zero(testMatrix);
}
由于該矩陣沒有零條目,因此 if 條件不應激活,最終remove1zero應回傳false。然而,事實并非如此。我已經在我的機器上以及http://cpp.sh/ 中嘗試過,輸出是1/ true。我將不勝感激任何有關為什么會發生這種情況的見解。
uj5u.com熱心網友回復:
正如在評論中提到的那樣,size_t是一個無符號的型別,j >= 0并且i >= 0比較將始終評估為“真”,當任一指標達到零,下一個值(遞減是零值后)將環繞最大值的size_t型別,導致未定義的行為(越界訪問)。
解決這個問題的一個很好的“技巧”是使用“goes to”偽運算子, -->,它實際上是兩個運算子的組合:C/C 中的“-->”運算子是什么?.
您可以在for回圈中使用它,如下所述,將“迭代運算式”留空(因為遞減是在“條件運算式”中完成的)并在“init-statement”中更高的索引處開始回圈(因為那個在進入回圈體之前將應用遞減)。
這是使用這種方法的函式版本(請注意,我在x-- > 0運算式中包含了一個空格,以澄清實際上涉及兩個單獨的運算子):
bool remove1zero(std::vector<std::vector<double>>& matrix)
{
size_t dim = matrix.size();
for (size_t j = dim ; j-- > 0; )
for (size_t i = dim ; i-- > 0; )
if (matrix[j][i] == 0.0) {
matrix[j][i] = -2.0;
return true;
}
return false;
}
uj5u.com熱心網友回復:
不要使用 size_t 作為回圈的型別。它可以評估小于零,因為它是無符號的。只需將大小轉換為整數并使用它。
bool remove1zero(std::vector<std::vector<double>> & matrix)
{
int dim = (int)matrix.size();
printf("matrix size=%d\n",dim);
for (int j = dim - 1; j >= 0; j--)
for (int i = dim - 1; i >= 0; i--)
{
printf("%d, %d\n",i,j);
if ((matrix[j])[i] == 0.0)
{
(matrix[j])[i] = -2.0;
return true;
}
}
return false;
}
uj5u.com熱心網友回復:
size_t等于unsigned long。當您檢查j或i在 for 回圈中時,您無法獲得負數。因此j,i當您從 0 中減去 1 時會得到一個奇怪的值。解決方案是更改size_t為簡單的long.
#include <iostream>
#include <vector>
bool remove1zero(std::vector<std::vector<double>> & matrix)
{
long dim = (long)matrix.size();
for (long j = dim - 1; j >= 0; j--)
{
for (long i = dim - 1; i >= 0; i--)
if (matrix[j][i] == 0.0)
{
matrix[j][i] = -2.0;
return true;
}
}
return false;
}
int main()
{
std::vector<std::vector<double>> testMatrix(3);
testMatrix[0] = std::vector<double> {-2.0, -2.0, 3.0};
testMatrix[1] = std::vector<double> {-2.0, -1.0, 3.0};
testMatrix[2] = std::vector<double> {2.0, 2.0, -1.0};
std::cout << remove1zero(testMatrix);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/339971.html
上一篇:Vue計算屬性與偵聽器
