Контейнер, в котором каждый элемент может иметь несколько неуникальных ключей (c ++ 17) - PullRequest
0 голосов
/ 18 октября 2018

Изображение У меня есть этот класс перечисления:

enum class MyEnum {
    enum1,
    enum2,
    enum3
}

И у меня есть структура / класс с именем MyClass ...

Каждый объект MyClass связан с одним или несколькими значениями MyEnum.

Мне нужен контейнер, который будет содержать объекты MyClass и иметь возможность возвращать список всех объектов MyClass, которые связаны с определенным значением MyEnum по запросу.Что-то вроде:

class Container<std::vector<MyEnum> key, MyClass item> {
public:

    std::vector<MyClass> getMyClassItemListByMyEnumKey(MyEnum enum) {
        return /*code to gather all MyClass items that have the searched MyEnum enum*/;
    }
};

Я могу придумать несколько способов сделать это с сомнительной эффективностью и масштабируемостью ... Но кто-нибудь знает о существующем ранее решении этой проблемы?Эта проблема абсолютно не выйдет за рамки того, что я опубликовал, я не буду рассматривать будущие расширения.

Я использую c ++ 17 и у меня нет проблем со сторонними библиотеками, если они 'у нас нет ограничительных лицензий.

1 Ответ

0 голосов
/ 18 октября 2018

Простое преобразование ваших требований в контейнер: вы хотите перейти от Enum к группе MyClass объектов:

map<Enum, vector<MyClass>>

Хотя это не совсем правильно, поскольку вы действительно хотите потенциальноподелиться MyClass объектов среди нескольких ключей.Итак:

map<Enum, vector<shared_ptr<MyClass>>>

Это выполнит работу, но у вас могут возникнуть вопросы по поводу производительности.Если все ваши значения Enum равны [0, n-1), а производительность становится проблемой, возможно, стоит просто обернуть vector:

class CustomMap {
    std::vector<shared_ptr<MyClass>> elems;

public:
    CustomMap() {
        elems.resize(n);
    }

    std::vector<shared_ptr<MyClass>>& operator[](Enum e) {
        return elems[static_cast<std::underlying_type_t<Enum>>(e)];
    }

    // etc.
};

И тогда, конечно, shared_ptr на самом деле неПравильно и для работы - вы, вероятно, захотите иметь vector<MyClass*> такой, чтобы CustomMap управлял ими по отдельности и т. д. В зависимости от того, куда вы хотите пойти, вы можете пробить гораздо больше кроличьих норе.

...