Функция гистограммы с использованием динамических массивов C++11

Моя программа запускается, чтобы запросить ввод пользователем указанного целого числа, а затем сохранить больше целых чисел в динамическом массиве. На выходе выдается гистограмма, использующая звезды, чтобы показать, сколько каждого целого числа.

У меня все задачи выполнены, кроме одной. Я часами пытался реализовать функцию подкачки, но не смог найти решение своей проблемы.

Моя проблема в том, что я хочу получить результат в порядке от наименьшего к наибольшему. Например,

Enter number of grades: 5 Enter grades (each on a new line): 20 4 10 10 20 Histogram: 20 ** 4 * 10 **

Однако вместо этого я хочу получить следующий вывод

Histogram: 4 * 10 ** 20 **

Вот мой код:

#include <iostream>
#include <vector>
#include <algorithm>
#include <iomanip>

using namespace std;

void hist(int arr[], int n);

void swap(int &a, int &b);

int main(){
  int* arr = NULL;
  int number;
  cout << "Enter number of grades:" << endl;
  cin >> number;

  cout << "Enter grades (each on a new line):" << endl;
  arr = new int[number];
  for(int i = 0; i < number; i++){
    cin >> arr[i];
  }
  hist(arr, number);
  return 0;
  delete [] arr;
}

void hist(int arr[], int n){
  cout << "Histogram:" << endl;
  for (int i = 0; i < n; i++){
    int j;
    for (j = 0; j < i; j++)
      if(arr[i] == arr[j])
        break;
    if (i == j){
      int xx = count(arr, arr+n, arr[i]);
      cout << setw(3) << arr[i] << " ";
      for (int j = 0; j < xx; ++j){
        cout << "*";
      }
      cout << endl;
    }
  }
}

void swap(int &a, int &b){
  int temp;
  temp = a;
  a = b;
  b = temp;
}

person David Ha    schedule 16.08.2016    source источник
comment
см. std::swap. Вы using namespace std;, поэтому добавляете к перегруженному набору std::swaps. Пробовали ли вы вызывать свою функцию подкачки из более простой функции, чтобы увидеть, действительно ли это вызывает у вас проблемы? Также прекратите делать это: int x; x = 1; и просто сделайте int x = 1;   -  person Ryan Haining    schedule 16.08.2016


Ответы (1)


Что вы хотите, так это отсортировать вектор перед подсчетом элементов.

void hist(int arr[], int n){
  sort(arr, arr+n);
  ...
}

Я бы посоветовал вам изменить решение. Если бы вы использовали std::map, у вас было бы решение вашей проблемы прямо здесь, в предварительно упорядоченном виде. Кроме того, почему бы вам не использовать std::vector?

person dau_sama    schedule 16.08.2016