c++中的While循环(使用break)

While loop in C++ (using break)

本文关键字:使用 break 循环 中的 While c++      更新时间:2023-10-16

我目前正在阅读《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;
}