C++ 无效指针查找频繁出现的元素

C++ 无效指针查找频繁出现的元素,c++,void-pointers,C++,Void Pointers,在开始为我的项目编写代码之前,我需要得到建议。它是关于查找频繁出现的元素(模式)。元素可以是int,char,类/结构的任何对象数组。因此,我必须使用void*。我有一个函数,它返回第一次出现的mode元素。i、 e int arr[] = { 1, 7, 2, 4, 4, 8, 4 } mode is 4 > return value 3 char arr[] = { 'q', 'w', 'w', 'u', 'u', 'w', 'o' } mode is w > return va

在开始为我的项目编写代码之前,我需要得到建议。它是关于查找频繁出现的元素(模式)。元素可以是
int
char
类/结构的任何对象
数组。因此,我必须使用
void*
。我有一个函数,它返回第一次出现的mode元素。i、 e

int arr[] = { 1, 7, 2, 4, 4, 8, 4 }
mode is 4
> return value 3
char arr[] = { 'q', 'w', 'w', 'u', 'u', 'w', 'o' }
mode is w
> return value 1
myClassObj[4];
myClassObj[0].mySetter(0,4);
myClassObj[1].mySetter(1,1);
myClassObj[2].mySetter(1,1);
myClassObj[3].mySetter(7,9);
> return value 1
我应该对任何类型的数组进行排序以查找模式吗?我应该使用地图库吗?我该怎么做,怎么开始

int indexOfFirstMode (const void * base, int num_of_elements, int size_of_arr, 
                      bool (*checker) (const void *, const void *));
编辑:


我现在不应该使用
模板

我想,你可以使用模板技术而不是
void*
。这使得解决方案更加容易:

#include <iostream>

using namespace std;


template <class T>
int indexOfFirstMode(T array[], int size, bool (*checker)(const T& a, const T& b))
{
    int index = -1;
    int max_num = 0;

    for (int i = 0; i < size; i++)
    {
        int value = array[i];
        int num = 1;

        for (int j = i + 1; j < size; j++)
            if (array[j] == value)
                num += 1;

        if (num > max_num)
        {
            index = i;
            max_num = num;
        }
    }

    return index;
}


bool checker(const int& a, const int& b)
{
    return a == b;
}


int main()
{
    int A[9] = {15, 3, 5, 7, 3, 1, 5, 5, 5};

    cout << indexOfFirstMode(A, 9, checker) << endl; // 2

    return 0;
}
#包括
使用名称空间std;
模板
int indexOfFirstMode(T数组[],int大小,布尔(*棋盘格)(常数T&a,常数T&b))
{
int指数=-1;
int max_num=0;
对于(int i=0;i最大数值)
{
指数=i;
max_num=num;
}
}
收益指数;
}
布尔检查器(常数内部和a、常数内部和b)
{
返回a==b;
}
int main()
{
inta[9]={15,3,5,7,3,1,5,5,5};

CUT

首先,在C++中使用<代码> Value*/COD>几乎是个好主意,总是有更好的方法。

void*
的问题在于,它们只提供内存中某个对象的起点,但不会告诉您应该从那里开始多少(即偏移量)

在您的情况下,您可以避免这种情况,因为您有
num\u of_elements
size\u of_arr
您可以计算偏移量,并且因为您为每种类型编写了不同的检查器,所以检查器函数知道需要比较的对象的大小

对于计算模式,有几种方法。您可以对列表进行排序,然后查找运行时间最长的元素,另一种方法是使用
std::map
将每个元素映射到其出现次数,然后取最大值

但是要小心,用
void*
实现这一点有点棘手,需要格外小心。
希望这有帮助。

看起来你只需要一个函数来比较两个元素的相等性,所以我不认为排序或使用地图总是可能的。这是关于C还是C++?“所以,我必须使用空洞*”你错了。你应该使用<代码> Boo::变量< /COD>。假设你的代码实际上是C++。为什么你要标记它?C?@ LeNEX CraceSein RealEnter。我应该根据原型编写代码。无论数组中的数据类型是什么,你的<代码>检查器> /代码>函数都是一样的。它仅仅是int类型的吗?另外,我想提出这个想法,但谢谢你的代码。我想它在课堂上不起作用