c++中的While循环(使用break)
While loop in C++ (using break)
我目前正在阅读《c++入门》这本书(在SO书单上推荐)。给出了一个练习,本质上是读取一些字符串,检查是否有字符串连续重复两次,如果字符串重复,打印哪个单词并跳出循环。如果没有重复,就把它印出来。这是我的解决方案,我想知道a)这是不是一个好的解决方案b)我的测试条件是没有重复的单词?因为我必须给变量加1才能让它像预期的那样工作。下面是我的代码:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main() {
vector<string> words = {"Cow", "Cat", "Dog", "Dog", "Bird"};
string tempWord;
unsigned int i = 0;
while (i != words.size())
{
if (words[i] == tempWord)
{
cout << "Loop exited as the word " << tempWord << " was repeated.";
break;
}
else
{
tempWord = words[i];
}
// add 1 to i to test equality as i starts at 0
if (i + 1 == words.size())
cout << "No word was repeated.";
++i;
}
return 0;
}
"好的解决方案"的定义在某种程度上取决于需求——最重要的总是"它是否有效"——但最重要的可能是速度和内存需求。
你的似乎工作(除非你有第一个字符串是空白的,在这种情况下,它会中断);所以肯定没那么糟。
我能给你的唯一建议是,你可以试着写一个不保留其中一个字符串副本的版本,因为如果它们真的非常非常大/很多,复制它们将是一个昂贵的过程怎么办?
我会将测试条件移到循环之外,因为似乎没有必要在每一步都执行它。为了便于阅读,我会添加一个bool
:
string tempWord;
unsigned int i = 0;
bool exited = false;
while (i != words.size())
{
if (words[i] == tempWord)
{
cout << "Loop exited as the word " << tempWord << " was repeated.";
exited = true;
break;
}
else
{
tempWord = words[i];
}
++i;
}
// Doing the check afterwards instead
if (!exited)
{
cout << "No word was repeated.";
}
a)如果这不是一个好的解决方案
对于指定的输入,这是一个很好的解决方案(它有效)。然而,tempWord没有初始化,所以第一次循环运行时,它将测试一个空字符串。因为输入不包含空字符串,所以它可以工作。但是如果你的输入以一个空字符串开始,它会错误地发现是重复的。
b)我的测试条件是没有重复的单词可以吗?因为我必须给变量加1才能使它按预期工作。
是的,这只是因为数组的索引从0开始,并且您正在根据数组中的项目计数进行测试。例如,一个count为1的数组将只有一个元素,它将被索引为0。所以你给i加1是对的
作为训练任务的答案,您的代码(在其他答案中建议的一些修复之后)看起来不错。然而,如果这是一个现实世界的问题(因此它不包含像"使用for循环和break"这样奇怪的限制),那么它的作者也应该考虑提高可读性的方法。
使用默认的STL算法几乎总是比重新发明轮子好,所以我将这样写代码:
auto equal = std::find_adjacent(words.begin(), words.end());
if (equal == words.end())
{
cout << "No word was repeated" << endl;
}
else
{
cout << "Word " << *equal << " was repeated" << endl;
}
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- C++:TypeDef使用元组
- 使用std::multimap迭代器创建std::list
- 从不同线程使用int64的不同字节安全吗
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么在全局范围内使用"extern int a"似乎不行?
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在 c++ 中在开关情况下使用和不使用"break"时的不同输出
- 使用flag、return、exception、goto或break中止过程
- 使用C 中的链接seam break static变量依赖关系
- 为什么在使用 select() 时连接到带有第二个套接字的服务器"break"第一次连接?
- 为什么在使用LLVM时,std::ifstream的缓冲"break" std::getline?
- 为什么我不能在C++的三元条件语句中使用 "break" 语句?
- 有没有办法使用 break 语句来解决
- 为什么我们要尽量减少循环中break和continue的使用
- 如何在while循环中使用带有break的openmp
- 不使用break退出do/while循环
- 在'for-loop'中使用'break'的性能影响
- c++中的While循环(使用break)
- 如何使用 break 语句停止内部和外部循环