在开始编写项目代码之前,我需要获得建议。它是关于经常发现元素(模式)。元素可以位于int
,char
,any object of class/struct
数组中。所以,我必须使用void*
。我有一个函数返回第一次出现的mode元素。即。
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 *));
修改
我现在不应该使用template
答案 0 :(得分:0)
我想,您可以使用模板技术代替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;
}
答案 1 :(得分:0)
首先,在C ++中使用void *
几乎不是一个好主意;总有一种更好的方式
void *
的问题在于它们只给你一个对象在内存中的起点,但它们不会告诉你应该从那里开多少(即偏移)。
在你的情况下你可以避免这种情况,因为你有num_of_elements
和size_of_arr
你可以计算偏移量,并且因为你正在为每种类型编写不同的检查器,所以检查器功能知道你需要比较的对象的大小。
为了计算模式,有几种方法可以做到这一点。您可以对列表进行排序,然后查找运行时间最长的元素,另一种方法是使用std::map
将每个元素映射到其出现次数,然后取最大值。
但请注意,使用void *
实现这一点有点棘手,您需要格外小心。
希望这会有所帮助。