gpt4 book ai didi

c++ - 从有限列表中简单选择

转载 作者:搜寻专家 更新时间:2023-10-31 01:45:25 25 4
gpt4 key购买 nike

我有三个变量需要以某种方式设置。例如,

int a, b, c;
a = choose(1, 2, 3); // a can take the value 1 to 3 inclusive
b = choose(1, 2, 3); // b can take the value 1 to 3 inclusive
c = ?????? // c can't take either of the values in a or b.

我能想到的设置 c 的最简单方法是使用循环:

do
{
c = choose(1, 2, 3);
}
while(c == a || c == b);

或者我可以使用 ifs 或 switch,或者 switch/if 组合:

a = choose(1, 2,  3);   
b = choose(1, 2, 3);

switch(a){
case 1:
switch(b){
case 1:
c = choose(2, 3)
break;
case 2:
c = 3;
break;
case 3:
c = 2;
break;
}
break;
case 2:

这两个看起来都不优雅,后者简直太丑了。

我在一个项目中遇到了另一个类似的情况,我使用了 std::setset_difference,但我不能在这里使用它,必须使用一个不太像 STL 而更老派的 C++ 解决方案。

有什么想法吗?

最佳答案

编辑

再看一遍,首先选择唯一元素,然后再选择其他两个更有意义。这样更干净,但可能仍然不够优雅。

如果您坚持使用 choose 的离散变量实现,它可能看起来像这样:

int choose(int, int); // two choice overload
int choose(int, int, int); // three choice overload

int main()
{
int c = choose(1, 2, 3);

int x = 1 + c % 3;
int y = 1 + (c + 1) % 3;

int a = choose(x, y);
int b = choose(x, y);
}

使用数组甚至更简洁,并且可以毫不费力地变得更通用:

int choose(int[], int); // takes an array and its (effective) size

int main()
{
constexpr int maxNum = 3;

int choices[maxNum] = {1, 2, 3};

//for larger values of maxNum, loop initialize:
//for(int i = 0; i < maxNum; i++)
//{
// choices[i] = i + 1;
//}

int c = choose(choices, maxNum);

choices[c-1] = maxNum;

int a = choose(choices, maxNum - 1);
int b = choose(choices, maxNum - 1);
}

对于只有三个变量,我会采用最简单的方法并使用您发布的 while 循环:

do
{
c = choose(1, 2, 3);
}
while(c == a || c == b);

如果您确实需要确定性运行时的保证,您可以尝试以下方法。但是,我不确定每个人都会觉得它更“优雅”,而且我认为可维护性的损失不值得。

if(a != b)
{
c = 6 - (a + b);
}
else
{
c = choose(0, 1);

c = 1 + (a + c) % 3;
}

考虑到问题的设置方式,两者都不是可扩展的,但在需要使其更普遍之前,我会假设 YAGNI .

关于c++ - 从有限列表中简单选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22177572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com