每个项目可以具有多个非唯一键的容器(c ++ 17)

时间:2018-10-17 22:59:09

标签: c++ containers c++17

图片我有这个枚举类:

enum class MyEnum {
    enum1,
    enum2,
    enum3
}

我有一个名为MyClass的结构/类...

每个MyClass对象都与一个或多个MyEnum值相关联。

我想要一个容纳MyClass对象的容器,并能够在请求时返回与特定MyEnum值关联的所有MyClass对象的列表。有点像:

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 :(得分:1)

只需将您的需求记录到一个容器中:您想从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单独管理它们,依此类推。您可以放下更多的兔子洞,具体取决于您要去的地方。