C ++按指令顺序对指针数组进行排序

时间:2016-12-22 10:10:18

标签: c++ arrays pointers for-loop bubble-sort

我有这个功能,其中2个矢量相互比较,程序找到与矢量的平方差的总和。

    double Search::NNS(vector<vector<double>> bb, vector<vector<double>> aa)
    {
        int M = 768; int N = 1024;
        int R = 49; int C = 36;
        //double SSD[] = MainVectorBlock[] - WallyVector[];
        //double SSD[] = SSD[] * SSD[];
        //sum = sum + SSD[];

    vector<vector<double>> &MainIMG = bb;
    vector<vector<double>> &WallyIMG = aa;
    double *SSD = new double[R*C];
    double sum = 0;


    for (int bx = 0; bx < M; bx += R)
        for (int by = 0; by < N; by += C)
        {
            Compare = new double*[R];
            for (int x = 0; ((x < R) && ((bx + x) < M)); ++x)
            {
                Compare[x] = new double[R];
                for (int y = 0; ((y < C) && ((by + y) < N)); ++y)
                {
                    if ((bx + x) >= M)
                    {
                        cout << Compare[bx + x] << Compare[by + y] << " ";

                    }

                    //cout << MainIMG[bx + x][by + y] << " ";
                    Compare[x][y] = MainIMG[bx + x][by + y] - WallyIMG[x][y];
                    Compare[x][y] = Compare[x][y] * Compare[x][y];
                    //sum += Compare[x][y];
                    SSD[R*C] += Compare[x][y];
                    //SSD[R*C] = sum;
                    //cout << Compare[x][y] << " ";
                }

            }
            //cout << "\n\n\n" << endl;
            //cout << sum << endl;
            //cout << SSD[R*C] << "\t" << sum << endl;

            for (int i = 0; i < R*C; i++)
            {
                for (int j = 0; j < R*C; j++)
                {
                    if (SSD[i] > SSD[j])
                    {
                        int temp = SSD[i];
                        SSD[i] = SSD[j];
                        SSD[j] = temp;
                    }
                }
            }

        }
    for (int a = 0; a < R*C; a++)
    {
        cout << SSD[a] << endl;
    }

    return 0;
}

我可以显示所有平方差值的总和,但是当我尝试按升序对值进行排序时,我继续得到这个值-6.27744e + 66。 我试图改变循环并将其放在主循环中,但我仍然继续获得该值。

2 个答案:

答案 0 :(得分:1)

double *SSD = new double[R*C];

您已分配内存,但从未将其初始化为某个值。然后你直接使用它:

SSD[R*C] += Compare[x][y];

在开始为其添加值之前,将SSD的所有项初始化为0

答案 1 :(得分:0)

您的代码存在多个问题。

  1. 您将按值传递2D向量到NNS函数,当它们应该通过const引用传递时。
  2. 您正在嵌套的for循环中创建内存泄漏。
  3. 您在和计算中编写了一个超过数组SSD末尾的文件。
  4. 您的SSD阵列未初始化为0。
  5. 这是一个没有内存泄漏的函数版本,并且允许来解决上面的第3项。虽然这可以改进,但它没有上述问题。

    #include <vector>
    #include <iostream>
    #include <algorithm>
    
    double Search::NNS(const std::vector<std::vector<double>>& bb, 
                       const std::vector<std::vector<double>>& aa)
    {
        int M = 768; int N = 1024;
        int R = 49; int C = 36;
        const std::vector<std::vector<double>> &MainIMG = bb;
        const std::vector<std::vector<double>> &WallyIMG = aa;
        std::vector<double> SSD(R * C);
        double sum = 0;
    
        for (int bx = 0; bx < M; bx += R)
        {
            for (int by = 0; by < N; by += C)
            {
                std::vector<std::vector<double>> Compare(R, std::vector<double>(R));
                for (int x = 0; ((x < R) && ((bx + x) < M)); ++x)
                {
                    for (int y = 0; ((y < C) && ((by + y) < N)); ++y)
                    {
                        Compare[x][y] = MainIMG[bx + x][by + y] - WallyIMG[x][y];
                        Compare[x][y] = Compare[x][y] * Compare[x][y];
                        SSD.at(R*C) += Compare[x][y];
                    }
                }
            }
        }
        std::sort(SSD.begin(), SSD.end());
        for (int a = 0; a < R*C; a++)
            std::cout << SSD[a] << std::endl;
        return 0;
    }
    

    问题1)通过const引用传递vector来解决。正如原始代码所做的那样,按照值传递矢量会产生不必要的副本。

    问题2)使用std::vector代替new[]来解决。现在没有内存泄漏。

    问题3)直接解决。所做的是使用std::vector::at()来证明发生了越界条件。如果在使用std::out_of_range时超出范围,将抛出at()异常,表明数组访问中存在错误。一旦执行该行,您的代码就会停止。这是我留给你解决边界条件的地方。

    您可能还想在at()向量上使用Compare,以确保您不会在那里超出范围。我很懒,不想在脑海里进行计算,但只要你有for个循环条件不使用vector::size()作为限制条件,而是使用计算来确定环路有多远,它看起来很可疑,并且是出现越界情况的候选者。

    此外,当您使用new[]时,无法保证您会收到此错误,并且根据您的说法,您没有得到任何迹象表明您做错了什么。使用std::vector可以使用at()检查边界条件。

    问题4)使用std::vector<double>解决,默认情况下,向量会将内容初始化为0。

    最后,请注意使用std::sort对范围进行排序,而不是慢速冒泡排序。

相关问题