将一维数组转换为二维数组

时间:2012-11-17 13:31:06

标签: c++ visual-c++

对于我的作业,它被赋予一维数组,我必须将其转换为二维数组。二维数组的列数为2,因为我必须将一维数组表示为对(数字的值,数组中的出现次数)。 这是尝试过的。错误出现在最后两行代码中:访问冲突写入位置0xfdfdfdfd。

#include <iostream>
#include <stdlib.h>
using namespace std;

int main()
{
    const int NR=17;
    int arr[NR]={6,7,3,1,3,2,4,4,7,5,1,1,5,6,6,4,5};
    int **newArr;
    int count=0;
    int countLines=0;
    int searched;
    for(int i=0;i<NR;i++)
    {
            newArr=new int*[countLines];
        for(int i=0;i<countLines;i++)
        {
            newArr[i]=new int[2];
        }
        searched=arr[i];
        if(i>0)
        {
            for(int k=0;k<countLines;k++)
            {
                if(newArr[countLines][0] == searched)
                {
                    searched=arr[i]++;
                }

                for(int j=0;j<NR;j++)
                {
                    if(searched==arr[j])
                    {
                        count++;
                    }
                }
                countLines++;
            }
        }
        else
        {
            for(int j=0;j<NR;j++)
            {
                if(searched==arr[j])
                {
                    count++;
                }
            }
            countLines++;
        }

        newArr[countLines][0]=searched;
        newArr[countLines][1]=count;
    }
}

2 个答案:

答案 0 :(得分:3)

首先在第一个循环中使用newArr,然后再分配任何内存。您不能取消引用不具有合法内存的指针。它会导致不确定的行为。

其次在最后一部分中,您将newArr分配一个等于countLines的内存。

newArr = new int*[countLines] ;

这意味着newArr的第一维中的索引是0------>countLines-1。再次未定义newArr[countLines][0] = searched ;。设为newArr[countLines - 1]

答案 1 :(得分:1)

我不会打扰逐行代码分析,因为(a)当人们回答你的问题时你正在改变它;(b)它会花费太长时间。但这里是一个关于旧车的总结(非详尽无遗):

  1. 从第二个循环开始,每次循环迭代都会泄漏内存(newArr)。
  2. 您多次访问阵列访问权限。
  3. 你不应该需要在所有中使用指针数组来解决这个问题。单个维度[N] [2]数组,其中N是唯一值的数量。
  4. 您可以解决此问题的一种方法(无数种方式)如下所示:

    #include <iostream>
    #include <algorithm>
    
    int main()
    {
        // 0. Declare array and length
        int arr[]={6,7,3,1,3,2,4,4,7,5,1,1,5,6,6,4,5};
        const size_t NR = sizeof(arr)/sizeof(arr[0]);
    
        // 1. sort the input array
        std::sort(arr, arr+NR);
    
        /* alternaive sort. for this input size bubble-sort is
           more than adequate, in case your limited to not being
           allowed to use the standard library sort */
        /*
        for (size_t i=0;i<NR;++i)
            for (size_t j=i+1;j<NR;++j)
                if (arr[i] > arr[j])
                {
                    arr[i] ^= arr[j];
                    arr[j] ^= arr[i];
                    arr[i] ^= arr[j];
                }
        */
    
        // 2. single scan to determine distinct values
        size_t unique = 1;
        for (size_t i=1;i<NR;++i)
            if (arr[i] != arr[i-1])
                unique++;
    
        // 3. Allocate a [unique][2] array
        int (*newArr)[2] = new int[unique][2];
    
        // 4. Walk array once more, accumulating counts
        size_t j=0;
        newArr[j][0] = arr[0];
        newArr[j][1] = 1;
        for (size_t i=1;i<NR;++i)
        {
            if (arr[i] != arr[i-1])
            {
                newArr[++j][0] = arr[i];
                newArr[j][1] = 0;
            }
            ++newArr[j][1];
        }
    
        // 5. Dump output
        for (size_t i=0;i<unique;++i)
            cout << newArr[i][0] << " : " << newArr[i][1] << endl;
    
        delete [] newArr;
    
        return EXIT_SUCCESS;
    }
    

    <强>输出

    1 : 3
    2 : 1
    3 : 2
    4 : 3
    5 : 3
    6 : 3
    7 : 2