do-while循环多条件评估C ++

时间:2018-01-14 18:19:32

标签: c++ loops conditional-statements do-while

本学期有C ++课程。上个学期我们正在学习Python,现在正在做一个我需要做出的赋值循环,循环而变量不等于数组中多个数字之一。 在python中,我会使用"而不是"功能,例如:

if a not in (1,2,3,4):

或类似的东西。 我天真的尝试在C ++中也是如此:

do {...}while(userin != (1,2,3,4);

但显然它不起作用。

有人知道如何在C ++中执行此操作吗?

5 个答案:

答案 0 :(得分:3)

您可以使用算法标题中的标准库函数查找。例如:

int user = // this comes from your code...;
std::vector<int> exclude{1,2,3,4};
do {...} while (std::find(exclude.begin(), exclude.end(), user) == exclude.end());

当用户不在排除数组中时,这将循环。

但是你必须要小心你在循环中改变的内容和方式:用户和/或排除 - &gt;否则你很容易得到无限循环。您必须确保终止条件,可能需要一些额外的计数器等。

您还可以创建自己的模板化函数,以便在某个容器中搜索值,例如:

template<typename Container, typename T>
bool within(const Container& c, T value) {
    return std::find(std::begin(c), std::end(c), value) != std::end(c);
}

然后你可以这样称呼它:

do {...} while !within(exclude, user);

其他例子:

std::vector<int> v{1,2,3};
std::cout << boolalpha 
    << within(v, 1) << std::endl
     << within(v, 5) << std::endl;

std::string s = "Hello world";
std::cout << within(s, 'o') << std::endl
          << within(s, 'x') << std::endl;

这里有实例:https://wandbox.org/permlink/qEzDZ93HvCaU0bJb

答案 1 :(得分:1)

没有其他答案指出<algorithm>标准函数的事实。

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> a = { 1,2,3,4,5 };

    if (std::any_of(a.begin(), a.end(), [](int val){ return val == 3; })) // true
        std::cout << "3 is in a" << std::endl;

    if (std::any_of(a.begin(), a.end(), [](int val){ return val == 7; })) // false
        std::cout << "7 is in a" << std::endl;

    return 0;
}

同样有std::all_of and std::none_of

答案 2 :(得分:0)

假设数组已排序,您可以使用bsearch,否则您需要实现搜索逻辑,正如alrtold所说。

答案 3 :(得分:0)

在C ++中没有内置的支持,所以你必须自己实现它。这是一种方式。

#Persistent
SetTimer, DetectProcess, 50
return

DetectProcess:
If (ProcessExist("notepad.exe")) ; if the process is already running
    ExitApp
; otherwise:
If (A_TimeIdlePhysical > 100) ; as long as there is no human input
{
    If (ProcessExist("notepad.exe"))  ; wait for either process start
        ExitApp
}
else ;  or human input
    ExitApp
return

ProcessExist(ProcessName){
Process, Exist, %ProcessName%
return Errorlevel
}

您可以更改int bar; std::vector<int> arr{1, 2, 3, 4}; do { // Code } while (std::find(arr.begin(), arr.end(), bar) == arr.end()); 的{​​{1}}。缺点是你必须指定大小,但它比std::vector<int>快。

答案 4 :(得分:0)

即使临时std::find 中的std::vector可能被编译器优化掉了(它肯定不会 1 ),保证高效方式只是比较“手工”:

do {...} while (userin != 1 && userin != 2 && userin != 3 && userin != 4);

在您的具体示例中,如果userin是整数类型,您可以:

do {...} while (userin < 1 || userin > 4);

1 比较this(向量),this(数组)和that