Я ищу элегантный способ определения, какой элемент имеет наибольшее вхождение (режим) в массиве C ++ ptr.
Например, в
{"pear", "apple", "orange", "apple"}
"apple"
элемент является наиболее частым.
Мои предыдущие попытки потерпели неудачу
РЕДАКТИРОВАТЬ: массив уже отсортирован.
int getMode(int *students,int size)
{
int mode;
int count=0,
maxCount=0,
preVal;
preVal=students[0]; //preVall holds current mode number being compared
count=1;
for(int i =0; i<size; i++) //Check each number in the array
{
if(students[i]==preVal) //checks if current mode is seen again
{
count++; //The amount of times current mode number has been seen.
if(maxCount<count) //if the amount of times mode has been seen is more than maxcount
{
maxCount=count; //the larger it mode that has been seen is now the maxCount
mode=students[i]; //The current array item will become the mode
}else{
preVal = students[i];
count = 1;
}
}
}
return mode;
}
Есть несколько возможных решений этой проблемы, но сначала несколько советов:
Не используйте массивы в стиле C использование std::array
для массивов фиксированного размера (во время компиляции) или std::vector
для массивов в куче (или C ++ 14 std::dynarray
если размер массива определяется во время выполнения, но не изменяется после создания). Эти контейнеры обеспечивают управление памятью, и вам не нужно передавать размер массива отдельно. В дополнение к использованию контейнеров, предпочитают использовать алгоритмы в <algorithm>
где уместно. Если вы не знаете контейнеры и алгоритмы, потратьте некоторое время, чтобы ознакомиться с ними, это время очень скоро окупится.
Итак, вот несколько эскизов решения:
Сортируйте массив, затем посчитайте вхождения последовательных значений. Это гораздо проще, чем отслеживать, какие значения вы уже посчитали, а какие нет. В основном вам нужны только две пары подсчета значений: одна для значения, которое вы сейчас подсчитываете, одна для максимального значения до настоящего времени. Вам понадобится только пятая переменная: итератор для контейнера.
Если вы не можете отсортировать массив или вам нужно отслеживать все рассчитывает, используйте карту для сопоставления значений с их количеством вхождений в массиве. Если вы знакомы с std::map
это очень просто сделать. В конце найдите максимальное количество, то есть максимальное значение карты:
for (auto i: students) countMap[i]++;
auto pos = std::max_element(begin(countMap), end(countMap),
[](auto lhs, auto rhs){ return lhs.second < rhs.second }); //! see below
auto maxCount = pos->second;
Примечание: здесь используется диапазон, основанный на C ++ 11, и полиморфная лямбда C ++ 14. Должно быть очевидно, что здесь делается, поэтому его можно настроить для поддержки C ++ 11 / C ++ 14, которую обеспечивает ваш компилятор.
Других решений пока нет …