1

クラス ヒストグラムを作成し、このクラスを操作する必要があります。入力は、1 次元配列または 2 次元配列にすることができます。配列を行列に変換すると問題が発生します。これは私がこれまでに試したことです。エラーは<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;
    }

}

main.cpp

#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はすでにメンバー変数であるためです。名前付きの新しい一時変数 double ポインターを作成し、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( aは常にソートさSortMatrixれるため、消えます)。map

これにより、O(N 2 ) アルゴリズムから O(N log N) アルゴリズムに変わります。他の人が指摘したバグは、それらを含むコードが不要になるため、完全に消えます。私が見ることができる唯一の本当の欠点は、結果おそらくもう少し多くのメモリを使用することです-個別に割り当てられたノードを持つバランスのとれたツリーを使用しますint。バランス用ビット)。ただし、これについて心配することはまったく想像できません-メモリ使用量が大幅に増加するのに十分な数のノードを用意するずっと前に、提示するノードが多すぎて、ユーザーへの提示を検討することさえできません。

于 2012-11-18T14:42:27.103 に答える
0

@ mathematician1975 は、主な問題に対する回答をすでに提供しています。には別のバグがありSortMatrix()ます。最初の列の要素のみを交換するため、並べ替え後に (2 番目の列の) カウントが正しくなくなります。挿入する必要があります

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

それを機能させるために。

于 2012-11-18T14:28:31.500 に答える