如何正确地确保我没有访问矩阵中的元素?

时间:2018-03-24 23:49:07

标签: c++ c++11 matrix

我在处理禁止的内存访问方面遇到了问题。我有一个任务是找到矩阵的最高山峰(定义为高于围绕它的数字平方和的数字)。代码工作时,我硬编码它不能访问矩阵中的元素,这根本不是一件好事。

如何确保我永远不会尝试访问我不应该访问的内存?

typedef std::vector<std::vector<double>> Matrix;
typedef std::vector<double> Vector;
unsigned CalculateSum(Matrix mat, int counter, int x, int y)
{
unsigned sum(0);
if (x < counter) return 0;
for (int i(x - counter); i <= (x + counter); i++) {
    if(y < counter) return 0;
    for (int j(y - counter); j <= (y + counter); j++) {
        if (i == x && j == y) continue;
        sum += mat.at(i).at(j);
    }
}
return sum;
}
Matrix HighestMountain(Matrix mat) 
{
for (int i(0); i < mat.size(); i++) {
    if (mat.at(i).size() != mat.size()) throw std::domain_error("Wrong 
format");
}
Matrix insert;
Vector v;
int sum1(0), sum2(0);
int counter(1);
for (int i(0); i < mat.size(); i++) {
    for (int j(0); j < mat.at(i).size(); j++) {
        if(i == 0 || j == 0 || i == mat.size()-1 || j == mat.at(i).size()-1) continue;
        while (CalculateSum(mat, counter, i, j) < mat.at(i).at(j)) {
            insert.clear();
            for (int k(i - counter); k <= counter + 2; k++) {
                for (int l(j - counter); l <= counter + 2; l++) {
                    v.push_back(mat.at(k).at(l));
                }
                insert.push_back(v);
                v.clear();
            }
            counter++;
            if(counter > i || counter > j || i+counter > mat.size()-1 || 
            j+counter > mat.at(i).size()-1) break;
        }
    }
}
return insert;
}

1 个答案:

答案 0 :(得分:0)

首先确定您要处理的各种情况。角元素有三个邻居。不是角落的边缘元素有五个。内部元素有八个。因此,有三种不同的情况需要代码。

或者您可以使用每个尺寸2大于数据的矩阵,并在所有边元素中添加零。然后你感兴趣的一切都是内部元素,有八个邻居。

一切都与设计有关。