在过去的几个月里,我一直在缓慢但肯定地在C ++中跋涉,而且我遇到了一个障碍,我一直想弄明白。我试过询问/阅读/搜索,但我找不到合适的答案。也许这仅仅是因为这个问题很难提出来。
我正在尝试做的是在我的程序结束时,让结束序列将输入值与Array中的值进行比较。我是否需要循环比较序列?这有更简单的方法吗?
#include <iostream>
#include <string>
using namespace std;
int main () {
string YesAnswers[5] = {"Y", "YES", "yes" "y"};
string Name;
string YN;
do {
cout << "Enter your name: ";
getline(cin, Name);
cout << "Your name is "<< Name;
cout <<"\nIs this correct? Y\N: ";
cin >> YN;
} while(YN == YesAnswers);
system("Pause");
return 0;
}
答案 0 :(得分:4)
您可以使用std::find()
中的<algorithm>
:
while (std::find(YesAnswers, YesAnswers + 4, YN) != YesAnswers + 4);
或者,如果您要YesAnswers
vector
或其他容器而不是数组:
std::vector<std::string> YesAnswers;
while (std::find(YesAnswers.begin(), YesAnswers.end(), YN) != YesAnswers.end());
std::find()
查找范围内的元素;如果找到该元素,它会向找到的元素返回一个迭代器(或一个指针,如果是数组);如果找不到该元素,则返回一个迭代器(或指针)到该范围的末尾。
请注意,与大多数(全部?)标准库算法一样,范围在开始时关闭,但在结束时打开。也就是说,“end”迭代器/指针应该指向一个接一个的元素。
答案 1 :(得分:0)
您可以使用std::set
。集合是有序的,因此对于大量元素来说比std::vector
更快找到东西但是在你的情况下你只有4,所以它可能没有什么区别。由于集合是为快速查找而设计的,因此它们实际上拥有自己的find
成员,因此您不必使用std::find
。因此,将YesAnswers
定义为
set< string > YesAnswers;
YesAnswers.insert( "Y" );
YesAnswers.insert( "YES" );
//... and so on
然后使用
检查YN
YesAnswers.find( YN ) != YesAnswers.end()
我仍然认为@James的答案更符合您的需求,因为您可以将YesAnswers
保留为一行初始化而不是一组的多行插入。
答案 2 :(得分:0)
一般情况下,如果您想查找某个值是否是某个集合的成员,您必须循环或使用某些算法或集合成员函数,如其他答案所示。
在你的情况下,只有四种可能性,所以理论上你可以使用逻辑OR(运算符||)在条件中明确地检查所有这些。
在我看来,针对您的特定问题的最佳解决方案是从用户处获取输入,将其转换为大写(例如检查here如何)并将其与仅两个字符串“Y”进行比较或“是”。
答案 3 :(得分:0)
一些事情:您可以在同一行声明相同类型的变量,例如:
string Name,YN;
您实际上可以声明一个布尔值,为您的循环初始化为True,并在给定一组条件的情况下将其更改为False。 **(C ++将任何非0值视为True,将0视为False,因此如果需要,您实际上可以将Integer用作布尔值。)
Bool IsYourName = True;
DO {
...
IsYourName = False;
for(int i = 0; i&lt; YesAnswers.size(); i ++)
if (YN == YesAnswers[i])
IsYourName = True;
}
while(IsYourName);
这是考虑接近循环的另一种方式