我目前正在阅读C ++ Primer一书(推荐在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;
}
答案 0 :(得分:1)
“好的解决方案”的定义在某种程度上取决于要求 - 最重要的将是“它是否有效” - 但最重要的可能是速度和内存要求。
你的似乎工作(除非你的第一个字符串是空白的,在这种情况下它会破坏);所以它肯定不是那么糟糕。
我能做的唯一建议就是你可以编写一个不保留其中一个字符串副本的版本,因为如果它们真的非常大/很多并且复制它们会怎么样呢?是一个昂贵的过程?
答案 1 :(得分:0)
a)如果这不是一个好的解决方案
对于指定的输入,这是一个很好的解决方案(它可以工作)。但是,tempWord未初始化,因此第一次循环运行时将测试空字符串。因为输入不包含空字符串,所以它可以工作。但是如果您的输入以空字符串开头,则会错误地发现重复。
b)我的测试条件是没有重复的话可以吗?因为我必须在变量中添加1才能使其按预期工作。
是的,这只是因为数组的索引从零开始,并且您正在根据数组中的项计数对其进行测试。因此,例如,计数为1的数组将只有一个元素将被索引为零。所以你向我添加1是正确的。
答案 2 :(得分: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.";
}
答案 3 :(得分:0)
作为培训任务的答案,您的代码(在其他答案中提出一些修复后)看起来很好。但是,如果这是一个现实世界的问题(因此它不包含诸如“使用for循环和中断”之类的奇怪限制),那么它的作者也应该考虑提高可读性的方法。
默认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;
}