Контейнер с ключевыми и критериями сортировки отдельно - PullRequest
0 голосов
/ 29 ноября 2018

Я хочу иметь коллекцию элементов, доступных для поиска по ключу (значение без знака), но я хочу, чтобы элементы сортировались на основе других критериев, то есть времени последнего обращения (которое является частью значения).

Как мне добиться этого в C ++?Я могу сортировать их отдельно по требованию, но могу ли я создать сам контейнер так, чтобы сортировка происходила автоматически?

Есть ли готовые контейнеры (в надстройке), в которые могут быть встроены аналогичные функции?

1 Ответ

0 голосов
/ 29 ноября 2018

Вероятно, вы могли бы реализовать что-то в этом роде, используя std::list и std::unordered_map, указывающие друг на друга.

#include <list>
#include <unordered_map>

template <typename A>
struct Cache {
    using key = unsigned;

    struct Composite {
        Composite(A &_a, std::list<key>::iterator _it) : a(_a), it(_it) {}
        A &a;
        std::list<key>::iterator it;
    };

    std::unordered_map<key, Composite> map;
    std::list <key> list;

    void insert(key k, A &a) { // Assuming inserting contains accessing                                                                                                          
        list.emplace_front(k);
        map[k] = Composite(a, list.front());
    }

    A &operator[](key k) {
        list.erase(map[k].it);
        list.emplace_front(k);
        return map[k].a;
    }

    A &last_accessed() { // or whatever else you wish to implement                                                                                                               
        assert(!list.empty());
        return map[list.front()].a;
    }
};

Это решение оптимизировано для отслеживания того, к какому элементу обращались в последний раз.Если вы хотите отсортировать данные по другому атрибуту, вы можете выполнить аналогичный процесс, но использовать std::set для хранения значений с помощью функции сравнения, а затем итераторы для этого из std::unordered_map, хешированного с выбранным вами ключом.

...