1

我必须创建一个类直方图并对这个类进行操作。输入可以是一维数组或二维数组。当我将数组转换为矩阵时出现问题。这是我到目前为止所尝试的。错误是<Unable to read memory>

直方图.h

#ifndef HISTOGRAM_H
#define HISTOGRAM_H
#include<iostream>
class Histogram
{
private:
    int** matrix;
    int lines;
    void SortMatrix();
public:
    Histogram(){ }
    Histogram(int elements[], int elementsNr);
    Histogram(int** m, int l);
    void Print();
};
#endif

直方图.cpp

#include"histogram.h"
using namespace std;
Histogram::Histogram(int** m, int l)
{
    matrix=m;
    lines=l;
    SortMatrix();
}

Histogram::Histogram(int elements[], int elementsNr)
{
    lines=0;
    //initialize matrix : elementrNr lines and 2 columns
    int** matrix=new int*[elementsNr];
    for(int i=0;i<elementsNr;i++)
    {
        matrix[i]=new int[2];
        matrix[i][0]=INT_MIN;
        matrix[i][1]=INT_MIN;
    }
    //search each element from the array in the matrix
    bool found=false;
    for(int i=0;i<elementsNr;i++)
    {
        found=false;
        for(int j=0;j<elementsNr;j++)
        {
            //the element was found in the matrix ( on the first column )
            if(matrix[j][0] == elements[i])
            {
                matrix[j][1]++;
                found=true;
                break;
            }
        }
        if(!found)
        {
            matrix[lines][0]=elements[i];
            matrix[lines][1]=1;
            lines++;
        }
    }
    SortMatrix();
}
void Histogram::SortMatrix()
{
    bool flag=true;
    int temp;
    for(int i=0;(i<lines) && flag;i++)
    {
        flag=false;
        if(matrix[i+1][0]>matrix[i][0])
        {
            temp=matrix[i][0];
            matrix[i][0]=matrix[i+1][0];
            matrix[i+1][0]=temp;
            flag=true;
        }
    }
}
void Histogram::Print()
{

    for(int i=0;i<lines;i++)
    {
        cout<<matrix[i][0]<<" : " <<matrix[i][1]<<endl;
    }

}

主文件

#include"histogram.h"
#include<iostream>
using namespace std;

int main()
{
    int arr[]={6,7,3,1,3,2,4,4,7,5,1,1,5,6,6,4,5};
    Histogram h(arr,17);
    h.Print();
}
4

3 回答 3

8

这里

int** matrix=new int*[elementsNr];

用。。。来代替

matrix=new int*[elementsNr];

因为matrix已经是一个成员变量。您正在创建一个名为的新临时变量双指针matrix并为其分配内存而不是您的成员变量matrix

于 2012-11-18T14:21:37.440 回答
3

一些人已经就如何解决这段代码的一些问题给了你建议。我将给出稍微不同的建议,相比之下,这些建议最初可能看起来有点残酷,但我会尝试展示它是如何真正有用而不是令人讨厌的。

我会扔掉你现有的代码,可能会有例外main,然后使用std::map. 您现在所做的基本上是尝试重新创建std::map已经提供的功能(即使您的代码已修复,它也不能像std::map开箱即用那样做好工作)。

使用 map,你的整个程序会变成这样:

std::ostream &operator<<(std::ostream &os, std::pair<int, int> const &d) { 
    return os << d.first << " : " << d.second;
}

int main() { 
    std::map<int, int> h;

    for (int i=0; i<17; i++)
        ++h[arr[i]];

    std::copy(h.begin(), h.end(), 
              std::ostream_iterator<std::pair<int, int> >(std::cout, "\n"));
    return 0;
}

如果你想维护与你的histogram类提供的几乎相同的接口,这很容易做到——for循环进入构造函数,copy进入print(并SortMatrix消失,因为 amap总是排序的)。

通过这样做,您从 O(N 2 ) 算法更改为 O(N log N) 算法。其他人指出的错误完全消失了,因为不再需要包含它们的代码。我能看到的唯一真正的缺点是结果可能使用更多的内存——它使用具有单独分配节点的平衡树,这可能会为仅包含 2 ints 的节点引入相当多的开销(以及位用于平衡)。不过,我无法完全想象会担心这一点——早在你有足够的节点让内存使用变得重要之前,你有太多的东西要展示,甚至无法考虑展示给用户

于 2012-11-18T14:42:27.103 回答
0

@mathematician1975 已经为主要问题提供了答案。中还有另一个错误SortMatrix():您只交换第一列的元素,因此在排序后,计数(在第二列中)将不再正确。你必须插入

temp=matrix[i][1];
matrix[i][1]=matrix[i+1][1];
matrix[i+1][1]=temp;

让它工作。

于 2012-11-18T14:28:31.500 回答