void指针经常发现元素

时间:2015-10-18 12:19:57

标签: c++ void-pointers

在开始编写项目代码之前,我需要获得建议。它是关于经常发现元素(模式)。元素可以位于intcharany 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

2 个答案:

答案 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_elementssize_of_arr你可以计算偏移量,并且因为你正在为每种类型编写不同的检查器,所以检查器功能知道你需要比较的对象的大小。

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

但请注意,使用void *实现这一点有点棘手,您需要格外小心。 希望这会有所帮助。