C ++数组中的值实例? (直方图)

时间:2014-04-30 23:32:06

标签: c++ arrays

我想知道在C ++中是否可以解析数组并检索整数出现在数组中的次数。我试图制作值的直方图,但目前我仍然坚持如何继续。

这是一个一维数组,如果这很重要,我正在使用这个函数来打印数组:

void print(int a[], int n)
{
    int j = 1;

    cout << endl;

    for(int i=0; i < n; i++)
    {
        if(!(j%6)) 
        {
            j=1; cout << endl << endl;
        }
        cout << right << setw(2) << a[i] << " "; 
        ++j; 

    }
}

在这个屏幕截图中给出了正确的输出:

http://i.imgur.com/P8Jzj1V.png

然而,一旦我进入直方图功能(我知道编码不正确),我得到以下输出:

http://i.imgur.com/WJtBjoF.png

因为使用我当前的代码,它是根据从数组中获取的值打印星号:

for (int i = 0; i < size; i++)
{
    cout << a[i] << ":" << bar(a[i-1]);
    cout << endl;
}

P.S。 - &#34; bar&#34; function只返回一个指定数量为&#39; *&#39;的字符串。根据给出的数字。

我知道最后一点是不正确的,但那是我试图解决的问题。

3 个答案:

答案 0 :(得分:1)

有两种简单的方法:

  1. 排序+计数
    1. 对数组进行排序
    2. 遍历所有内容,并在遇到不同元素/结尾时打印摘要。
  2. unordered_map
    1. 创建std::unordered_map<int,int>
    2. 在遇到它时,遍历数组递增每个遇到元素的计数。
    3. 打印摘要。
  3. 大小为2 ** sizeof(int)*CHAR_BIT的数组非常大。

答案 1 :(得分:0)

让我们看看。您可以使用每个元素的计数来保存地图,每个元素都是地图的关键字:

  for (int i = 0; i < size; i++)
  {
    int current = a[i];
    //if it doesn't find it  it returns 
    if (countMap.find(current) != countMap.end())end()
    {
      countMap[current]++;
    } else
    {
      countMap[current] = 1;
    }    
  }

我不知道语法是否完全正确,但是这样的东西会让你得到你想要的东西。

答案 2 :(得分:0)

想出来。

int tempVal = 0;
int tempTwo = 0;
int counter = 0;
for (int i = 0; i < size; i++) // Checks for histogram output
{
    tempVal = a[i];
    for (int j = 0; j < size; j++)
    {
        if(a[j] == tempVal)
        {
            counter += 1;
        }

    }
if(tempVal != tempTwo)
    cout << setw(3) << tempVal << " : " << bar(counter) << endl;
    tempTwo = tempVal;
    counter = 0;
}