【问题标题】:Using enum value as a entry in a map in c++在 C++ 中使用枚举值作为映射中的条目
【发布时间】:2013-12-15 09:31:45
【问题描述】:

我有一个枚举:

enum FlowType {

        LEVEL_FLOW = 1,
        PARTITION_FLOW = 3,
        ORDERBOOK_EVENT_FLOW = 4
}

我想创建一个映射,以便在搜索上面的整数部分时,我必须取回“LEVEL_FLOW”部分。

我无法提出地图声明和插入语句。请帮忙。

这是我试过的:

std::map<int, FlowType > FlowsMap;
FlowsMap.insert(std::make_pair<1, FlowType.LEVEL_FLOW >);

【问题讨论】:

  • FlowType::LEVEL_FLOW
  • 为什么要将枚举映射到具有相同值的 int?枚举是整数。
  • @Pat - 如果第一个是 id 并且有数百个 ids 并且每个都有 FlowType ..
  • @Pat: 0) 他将 int 映射到枚举类型,反之亦然 1) 枚举就像指针一样多 intbools 是

标签: c++ enums


【解决方案1】:

如果enum 在同一个范围内,您应该只使用LEVEL_FLOW 而不是FlowType.LEVEL_FLOW。否则,也要指定范围。

【讨论】:

  • 没错,但你在编译 std::make_pair 时仍然会遇到麻烦。
  • @JulienB。 - 像这样:ideone.com/iDka7A ?你有什么“烦恼”?
【解决方案2】:

如果要添加值:

typedef enum e
{
    ONE = 1,
    TWO = 2,
    THREE = 3
} etype;

int main(int arc, char **argv)
{
    std::map <etype, std::string> mmap;
    mmap[THREE] = 3;
}

【讨论】:

  • 你知道mmap[THREE]的值是多少吗?
【解决方案3】:

您在插入时面临的问题在于您的语法。你应该写:

FlowsMap.insert(std::make_pair(1, FlowType.LEVEL_FLOW));  
// make_pair is a function (make_pair()), pair is a type (pair <>)

或者更好

FlowsMap[1] = LEVEL_FLOW; 

没有必要为地图中的值项重载比较运算符。此外,即使您的密钥是 FlowType 枚举,也不需要它。

但是我想知道您是否真的需要一个映射...什么时候可以将 int 转换为枚举类型:

int myInt = 1;
FlowType ft = static_cast<FlowType> (myInt);

唯一的问题是某些 int 没有关联的枚举值。您可以使用 find() 方法在地图上防止这种情况。如果您知道这种情况不会发生,您可以考虑避免使用地图。

【讨论】:

  • “或者更好” - insertoperator[] 对于 std::map 来说(总是)不一样。
【解决方案4】:

请注意,您使用的是 C 风格的枚举。

如果您想坚持使用它们,可以通过将代码更改为来修复它:

FlowsMap.insert(std::make_pair&lt;1, LEVEL_FLOW &gt;);

如果您希望枚举名称成为范围的一部分(就像您在示例中尝试的那样),请查看 this thread on C++-style enums

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 2020-01-15
    相关资源
    最近更新 更多