我在编写需要检查一种累积权限的特定if语句时遇到一些麻烦,并且类似于它会是这样的:
X
或NULL
,Beta可以是A
,B
,C
或NULL
; Y
/ N
],Beta = A [Y
/ {{1 }},Beta = B [N
/ Y
],Beta = C [N
/ Y
]); N
,则Beta设置为任意内容且房间设置为[Alpha = X - > X
]员工可以进入那个房间; Yes
,则Beta设置为X
且房间有[Alpha = X - > NULL
]员工无法进入那个房间; No
,Beta设置为X
,则房间的[Alpha = X - > A
]和[Beta = A - > No
]员工可以进入那个房间,最后Yes
,Beta设置为X
,则房间的[Alpha = X - > A
]和[Beta = A - > No
]员工无法进入该房间我的问题是:我在一个循环中有一个巨大的if语句,它在房间内运行,向员工列出可用的房间。任何人都可以建议一个新的外观吗?
答案 0 :(得分:0)
而不是:
master_access = {}
for each employee in employees
access = {}
for each room in rooms
if employee_has_access(employee, room)
access.add(room)
master_access.add(access)
return master_access
您可以执行类似
的操作for each room in rooms
if room.Alpha then alpha_rooms.add(room)
if room.Beta.A then beta_a_rooms.add(room)
else if room.Beta.B then beta_b_rooms.add(room)
else if room.Beta.C then beta_c_rooms.add(room)
master_access = {}
for each employee in employees do
access = {}
if employee.Alpha == 'X' then access = access union alpha_rooms
if employee.Beta == 'A' then access = access union beta_a_rooms
else if employee.Beta == 'B' then access = access union beta_b_rooms
else if employee.Beta == 'C' then access = access union beta_c_rooms
master_access.add(access)
return master_access
第一个样本 - 也许你在做什么 - 员工和房间数量是O(er)
,而第二个样本更像是O(e + r)
(或者,至少可以更像是constexpr bool f(const char *&s) {
do {
++s;
} while (*s);
return true;
}
constexpr bool g(const char *s) {
return f(s);
}
int main() {
static_assert(g("x"), "");
}
如果您愿意预先计算所有六个房间列表并在第二个循环中添加一层嵌套来直接选择每个员工的房间列表。