【问题标题】:How to elegantly put all enums into a std::set如何优雅地将所有枚举放入 std::set
【发布时间】:2013-03-14 14:05:52
【问题描述】:

我有一个枚举,我想将它们全部放入集合中(然后使用 set_intersection 算法删除一些,但这是题外话)。 除了我卡在第 1 步之外,一切都很好。:)

如果我有(真实类有更高基数的枚举)

class MyClass
{
enum Color{red, green , blue}
};

我将如何初始化 std::set<MyClass::Color> 以包含所有枚举。
我显然可以一个一个地手动插入它们,使用强制转换进行 for 循环,因为它们是连续的并且从 0 开始(我认为如果我在枚举定义中不使用 = 是必需的),但我正在寻找一种更优雅的方式。

编辑:如果可能,我更喜欢 C++03 解决方案,因为当前的问题实例需要它,但如果不是,C++11 也很高兴知道。

【问题讨论】:

  • 如果它们是连续的并且从零开始,您可以添加total作为最后一个枚举元素,其值等于值的数量=)
  • 来自@kassak totalcolors_count 的好话作为枚举的最后一个元素在许多情况下非常有用
  • @kassak 我知道这个技巧,但这取决于 CAPS LOCK cmets 阻止 ppl 去定义每个枚举的 int 值。 :)

标签: c++ enums stdset


【解决方案1】:

这是一个选项:

#define COLORS {red, green , blue}
enum Color COLORS;
static std::set<Color> color_set() {
    return COLORS;
}
#undef COLORS

【讨论】:

  • @NoSenseEtAl 是的,初始化列表。
  • 我编辑了 Q 说如果可能的话我更喜欢 03,但如果这是唯一的好方法我会接受你的 A。很抱歉在最初的 Q 中没有提及它。:)
  • 如果你没有初始化列表,你可以做类似Color colors[] = COLORS; return std::set&lt;Color&gt;(colors, colors + sizeof(colors) / sizeof(*colors));
  • @NoSenseEtAl in 03 你可以不用大括号定义,然后通过逗号分隔的列表来提升分配
  • @JackAidley:#define 经常不优雅,因为它们真的很难阅读。但是在这种情况下,我认为它实际上非常容易阅读,并且生成的代码非常简短。
【解决方案2】:

使用std::bitset&lt; total_colors &gt;。对于有限空间上的集合,这是更合适的数据结构。每种颜色都映射到一个布尔值,表示它是否是集合的一部分。您可以使用my_bitset.set() 将其初始化为所有true

【讨论】:

    【解决方案3】:

    就我个人而言,我会使用一个循环,并在我进行的过程中进行投射。

    但是,如果您对强制转换不满意,您可以在枚举上定义运算符,以便您可以使用 ++ 对其进行迭代。这样你就可以在不强制转换的情况下循环。

    【讨论】:

    • 好吧,++ 的定义将包含演员表。
    • 是的,但循环不会。您将处理一个隐藏可怕细节的界面。
    猜你喜欢
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    相关资源
    最近更新 更多