我正在学习C ++,发现自己经常写这样的代码:
vector<string> Text;
string Line;
while (getline(cin, Line))
{
Text.push_back(Line);
}
我想知道是否有一种更紧凑的方式来仅使用基本功能(例如,没有用户编写的功能)来编写循环-或多或少地使所有条件处于条件中?
答案 0 :(得分:10)
您可以使用for循环。我们可以在变量声明部分声明Line
,然后使用条件和增量部分读取和放置行。那给你
for(string Line; getline(cin, Line); Text.push_back(Line));
答案 1 :(得分:2)
好吧,以一些混淆为代价,
while (getline(cin, Line) && (Text.push_back(Line), 1));
会这样做:请注意使用表达式分隔符运算符,它非正式地将void
的{{1}}返回类型转换为{{1} },因此可以使其与短路push_back
一起使用。
但是根据经验,使用 语言而不是反对语言。我的回答是做后者。在问题中呈现代码的方式已经足够。
答案 2 :(得分:2)
或多或少,一切都处于状况之中?
您可以做到
while (getline(cin, Line) && (Text.push_back(Line),true)) {}
之所以起作用,是因为&&
短路,并且逗号运算符评估了第一个操作数,丢弃了结果并返回了第二个操作数的结果。
所以有可能,但是为什么要这么做呢?使代码尽可能密集的做法很少会提高可读性(实际上,您的原始代码更具可读性,并且使用的字符更少)。
答案 3 :(得分:1)
冒着“但这就是OP的代码!”的风险,如果这是作用域的整个主体(例如,解析文本的函数),我个人更喜欢此版本:
vector<string> Text;
string Line;
while (getline(cin, Line))
Text.push_back(Line);
或者,如果属于较大范围的一部分,我可能会将所有四行组合在一起,并在视觉前后添加空行以保持视觉连贯性(并可能在其之前添加一个简短的注释):
// [lots of other code]
// Gather input from cin.
vector<string> Text;
string Line;
while (getline(cin, Line))
Text.push_back(Line);
// [lots of other code]
我知道这不会引入任何巧妙的技巧,但这是给定代码的最紧凑和可读性形式,至少对我而言。
如果您想使紧凑性高于一切,则可以选择垃圾变量,省略所有不必要的空格,甚至预先给类型加上别名(因为我们“经常写”这种代码,这是一次性的),例如, V<S> t;S l;while(getline(cin,l))t.push_back(l);
,但没人想读。
因此,显然,不仅仅是紧凑性。对于我来说,我希望将噪声降到最低,同时保持直观的可读性,我建议这是一个令人满意的目标。
我永远不会使用“将所有内容放入循环条件中”的建议,因为这大大破坏了我期望代码的结构:循环的主要目的进入了循环主体。可能会不同意/抱有不同的期望,但是在我看来,其他所有事情只是为了炫耀您的精简技巧,它不会产生良好的代码。
以上内容仅实现了这一点:括号是此简单操作的噪音,而重要的部分是循环主体。 “但是getline
也不重要吗?” -是的,老实说,我更喜欢在循环主体中使用的版本,例如假设
vector<string> Text;
while (cin.hasLine())
Text.push_back(readLine(cin));
这对我来说是一个理想的循环:条件 only 检查终止,并且循环主体为 only 我们要重复的操作。
一种更好的方法是使用标准算法,但是我不知道有什么方法可以帮助(范围或增强可能会提供,我不知道)。
在更抽象的层次上,如果OP经常编写此确切的代码,则它显然应该是一个单独的函数。但是,即使不是这样,“大量其他代码”示例也将从该抽象中受益。
答案 4 :(得分:-3)
使用一条指令循环。您可以将其写在一行中,但我不推荐
while (getline(cin, Line)) Text.push_back(Line);