如果使用相同的类型来枚举和收集天数会很麻烦。您应该区分WeekDay 作为天的符号和天的集合,如Weekend。查看int 类型。变量int something 只能包含一个数字。如果你想要更多,你必须使用collection:array、vector等。
我假设您想要创建每天只出现一次的工作日集合。为此,我们通常使用集合。
此答案包含使用std::set、std::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;
}