寻找更紧凑的语法(简单代码)-C ++

时间:2018-08-08 12:30:59

标签: c++

我正在学习C ++,发现自己经常写这样的代码:

vector<string> Text;
string Line;

while (getline(cin, Line))
{
    Text.push_back(Line);
}

我想知道是否有一种更紧凑的方式来仅使用基本功能(例如,没有用户编写的功能)来编写循环-或多或少地使所有条件处于条件中?

5 个答案:

答案 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);