【问题标题】:How to assign multiple enum value to same enum variable in c++? [duplicate]c++ - 如何将多个枚举值分配给C++中的同一个枚举变量? [复制]
【发布时间】:2017-10-25 12:52:44
【问题描述】:

例如,我们初始化一个枚举实例。

enum weekdays {Saturday, Sunday, Tuesday,Wednesday, Thursday, Friday} weekend;

我们可以让weekend同时分配Saturday and sunday吗?

【问题讨论】:

  • 提示:2 的幂和位掩码...
  • 你明白枚举值只是数字吗?哪个默认从 0 开始并以 1 递增?
  • @Sean - 这不会将两个值都分配给weekend。两者都不相等。
  • @StoryTeller - 我知道这一点。我试图提供一些关于他在他的例子中需要改变的指针(即日子的价值)/
  • @Sean - 我知道知道。但是给出这样的提示只会让 OP 感到困惑。他似乎没有掌握这里的基础知识。所以我的评论实际上更倾向于

标签: c++


【解决方案1】:

如果使用相同的类型来枚举和收集天数会很麻烦。您应该区分WeekDay 作为天的符号和天的集合,如Weekend。查看int 类型。变量int something 只能包含一个数字。如果你想要更多,你必须使用collection:array、vector等。

我假设您想要创建每天只出现一次的工作日集合。为此,我们通常使用集合。

此答案包含使用std::setstd::bitset 和自定义类的示例。

std::set 的示例。

#include <iostream>
#include <set>

enum WeekDay { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday };

int main()
{
    std::set<WeekDay>   Weekend{ WeekDay::Saturday, WeekDay::Sunday };
    // For older compilers can be replaced with:
    // std::set<WeekDay>    Weekend;
    // Weekend.insert( WeekDay::Saturday );
    // Weekend.insert( WeekDay::Sunday );

    WeekDay today = WeekDay::Wednesday;

    // There is no Weekend.contains( today )
    // nor something likie Pascal
    // today in Weekend

    // Not so pretty
    if ( Weekend.find( today ) != Weekend.end() )
    //alternative:
    //if ( Weekend.count( today ) )
        std::cout << "Weekend :)\n";
    else
        std::cout << "Not weekend :(\n";
    return 0;
}

不幸的是,它看起来既不漂亮也不优雅。我愿意改进。

还有std::bitset版本:

#include <iostream>
#include <bitset>

enum WeekDay { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday };

int main()
{
    // I don't like this. Number of elements = last element + 1.
    std::bitset<WeekDay::Friday+1>  Weekend;
    Weekend[ WeekDay::Saturday ] = true;
    Weekend[ WeekDay::Sunday ] = true;

    WeekDay today = WeekDay::Wednesday;

    if ( Weekend[ today ] )
        std::cout << "Weekend :)\n";
    else
        std::cout << "Not weekend :(\n";
    return 0;
}

以及自定义解决方案:

#include <iostream>
#include <assert.h>

enum WeekDay { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday };

class WeekDays
{
public:
    WeekDays() : set( 0 ) {}

    // For older compilers just omit this constructor.    
    WeekDays( const std::initializer_list<WeekDay>& init )
        : set( 0 )
    {
        for ( auto it = init.begin() ; it != init.end() ; ++it )
            insert( *it );
    }

    void insert( WeekDay d )
    {
        assert( d >= WeekDay::Saturday && d < WeekDay::Friday && d >= 0 && d <= 31 );
        set |= 1 << d;
    }

    bool contains( WeekDay d )
    {
        assert( d >= WeekDay::Saturday && d < WeekDay::Friday && d >= 0 && d <= 31 );
        return ( set & ( 1 << d ) ) != 0;
    }

private:
    unsigned int    set;
};

int main()
{
    WeekDays    Weekend{ WeekDay::Saturday, WeekDay::Sunday };
    // For older compilers can be replaced with:
    // WeekDays Weekend;
    // Weekend.insert( WeekDay::Saturday );
    // Weekend.insert( WeekDay::Sunday );

    WeekDay     today = WeekDay::Wednesday;
    if ( Weekend.contains( today ) )
        std::cout << "Weekend :)\n";
    else
        std::cout << "Not weekend :(\n";
    return 0;
}

【讨论】:

  • 真诚感谢您的回答;我会认真阅读的。
【解决方案2】:

您可以将您的枚举声明为 2 的幂。 例如

enum weekdays {Saturday  =0 , Sunday = 1, Tuesday = 2,Wednesday = 4, Thursday = 8, Friday= 16} weekend;

现在您可以使用 | 分配多个枚举它们之间的运算符。

要检查是否设置了任何枚举,请使用运算符 &

【讨论】:

  • 2 的幂在变大时会出现拼写错误。我一直更喜欢(1&lt;&lt;0)(1&lt;&lt;1)(1&lt;&lt;2) 等。另外,更喜欢每个名字都至少设置一个位(你的星期六没有设置位)。
猜你喜欢
  • 2014-09-20
  • 2021-10-21
  • 2015-04-06
  • 1970-01-01
  • 2013-06-01
  • 1970-01-01
  • 2016-04-13
  • 1970-01-01
  • 2010-12-22
相关资源
最近更新 更多