Хороший алгоритм получения парной комбинации элементов

Я пытаюсь написать приложение, которое будет иметь функцию "special_reorder" и является ядром моего приложения. Возможно, это самая сложная функция в моем приложении. Эта функция является членом класса, аналогичного std::map, однако она не сортирует автоматически содержащиеся элементы. После вызова функции такой объект класса должен быть воссоздан так, чтобы элементы карты были расположены в следующем порядке. Единственное, что я хочу сделать, - это чтобы каждый следующий вызов функции отличался последовательностью следующих уникальных элементов от всех предыдущих элементов в этом объекте до тех пор, пока функция не будет вызвана n раз, где n - это число всех различных комбинаций. Я слаб в математике, но я знаю, что число перестановок х! = n, где x - количество элементов на карте. Я хочу, чтобы эта функция была не такой медленной. Я думаю, что ключи должны в основном использоваться для переупорядочения, потому что они имеют тип short в экземпляре класса в моем приложении.

Вот код класса:

#ifndef MY_MAP_H
#define MY_MAP_H

template<typename A, typename B>
class my_map
{
    private:
    int count, len ;
    A *keys ;
    B *values ;

    void resizeContent()
    {
        A *new_k = new A[len * 2] ;
        B *new_val = new B[len * 2] ;
        for(int aa = 0; aa < len; aa++)
        {
            new_k[aa] = keys[aa] ;
            new_val[aa] = values[aa] ;
            delete[] keys ;
            delete[] values ;
            keys = new_k ;
            values = new_val ;
            len *= 2 ;
        }
    }

    public:
    my_map()
    {
        count = 0 ;
        len = 10 ;
        keys = new A[len] ;
        values = new B[len] ;
    }
    ~my_map()
    {
        delete[] keys ;
        delete[] values ;
    }

    void special_reorder()
    {

    }

    int size()
    {
        return count ;
    }

    void replace(int first, int second)
    {
        if(first >= count || second >= count || first < 0 || second < 0)
        return ;
        A k_tmp = keys[first] ;
        B v_tmp = values[first] ;
        keys[first] = keys[second] ;
        values[first] = values[second] ;
        keys[second] = k_tmp ;
        values[second] = v_tmp ;
    }

    void insert(A key, B val)
    {
        if(count == len)
        resizeContent() ;
        keys[count] = key ;
        values[count++] = val ;
    }

    B& operator[] (const int index)
    {
        return values[index] ;
    }
} ;

#endif

Пожалуйста, помогите мне реализовать эту функцию или дайте мне хорошее представление о том, как это сделать.

1 ответ

Решение

Так как вы используете C++ рассмотреть

станд::next_permutation

как решение вашей проблемы.

Другие вопросы по тегам