C ++:终止遍历字符串向量的循环的最优雅方法?

Posted

技术标签:

【中文标题】C ++:终止遍历字符串向量的循环的最优雅方法?【英文标题】:C++: Most elegant way to terminate a loop that iterates over a vector of strings? 【发布时间】:2017-12-17 17:38:09 【问题描述】:

假设我创建了一个向量,其大小尚未表示,其元素是字符串。我想使用 for 循环和cin 将字符串输入到这个向量中。然后,当用户输入完字符串后,我希望 for 循环终止。

我知道有两种方法可以做到这一点。可以使用 Windows 上的 Ctrl + Z 或 Unix 上的 Ctrl + D 来终止输入流。我还可以使用带有break 的if 语句,这样在输入某个字符串(例如"end")时,循环就会终止。

我的实现将是两者中的后者:

vector<string> words;

for(string temp; cin >> temp;)

    if(temp == "end")
    break;

    else
    words.push_back(temp);

因此,对于输入 foo bar,循环不会终止,但对于输入 foo bar end,循环将终止(对于 foo end bar,循环将终止,因此向量仅包含字符串 "foo") .

上述实现是不是最好的方法?只使用 Ctrl + Z 或 Ctrl + D 会不会更有效,因为这样可以避免在每次迭代中都执行 if 语句?

如果我们有一个元素类型为int 的向量,情况会有所不同,因为用户可以输入任何非整数来终止循环。但在字符串的情况下,用户输入的任何内容都可以被视为字符串。

我正在阅读 Bjarn Stroustrup 所著书籍“编程 - 使用 C++ 的原理和实践”的第 4 章。

【问题讨论】:

请先测量,再优化。开销比那个小的if 分支要大得多:用户。 if 无关紧要。 Ctrl Z/D 关闭输入。之后您将无法阅读任何内容。 @JakeFreeman break 很好,而 done 的东西可读性要差得多。你写它的方式也是错误的,因为它会多读一行。 @JakeFreeman:不管某人的愚蠢、武断的规则如何,break 本质上并没有错。循环条件通常更好地直接反映循环的终止条件,但您建议的方式也不会这样做。在这种情况下,循环条件很容易反映退出条件——如我的回答所示。 @JakeFreeman,official subset doc 表示他们省略了可以通过其他方式表达以简化测试准备的无关紧要的功能。 break 甚至被列为潜在相关/有用。请记住,针对某些特定高中生的 AP 测试环境并不代表专业编程工作,并且在该环境中不使用 break 是在任何地方和所有人都不允许使用它的可怕理由。 【参考方案1】:

我希望循环标头以反映预期的退出条件,所以如果您想在用户输入end 之前阅读,我希望在循环条件下进行该测试:

for (std::string temp; std::cin >> temp && temp != "end"; )
    words.push_back(temp);

就“效率”而言,在这种情况下,它几乎肯定是无关紧要的。专注于使代码简单易读。仅在需要测量节目时进行优化。

【讨论】:

...我很自责,因为我错过了 for 循环中明显的条件部分。另外,我注意到您使用了 std::string 和 std::cin。我通常通过不执行“使用命名空间标准”来做到这一点,但为了简洁起见,在问题中省略了它。避免“使用命名空间 std;”是更好的做法吗? @Joel, ***.com/questions/1452721/…

以上是关于C ++:终止遍历字符串向量的循环的最优雅方法?的主要内容,如果未能解决你的问题,请参考以下文章

将指针向量元素推回非指针向量c ++时出错

2019/8/18 C语言循环结构的结束

es6的循环方法

JavaScript里面的循环方法小结

C ++在固定大小9的右填充空终止字符数组中找到第一个空格的最快方法

常见遍历方法 for循环forEachmapfilterfindfindIndexsomeevery