【问题标题】:Looking for a more compact syntax (simple code) - C++寻找更紧凑的语法(简单代码) - C++
【发布时间】:2026-01-10 05:20:03
【问题描述】:

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

vector<string> Text;
string Line;

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

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

【问题讨论】:

  • 单指令循环,如何更紧凑?空循环?
  • 这是最基本的。它从cin 输入流中读取,直到getline() 失败。
  • 为什么你想让它更紧凑?这给你带来什么好处?它肯定不会使它更具可读性!
  • “紧凑语法”和“简单代码”并不总是(很少?!)相同的东西。那你想要哪一个?
  • 如果您想要紧凑,请使用std::string::reservestd::cin::read。这会将文件读入一个大字符串(前提是您保留了足够的空间),因此数据更加紧凑,从而在内存中留下更少的孔或间隙。此外,两个语句,因此在源代码中更加compact。在互联网上搜索“内存映射文件”,将您的操作系统名称附加到关键字。

标签: c++


【解决方案1】:

您可以使用 for 循环。我们可以在变量声明部分声明Line,并使用条件和增量部分来读取和放置行。这给了你

for(string Line; getline(cin, Line); Text.push_back(Line));

【讨论】:

  • 更紧凑?和可读性?我们有一个读取函数,用于比较循环和内部函数的结果。所以把它写成 for/do while/while 或任何不会让事情变得更好的东西!
  • @Klaus 用户不想要更好,他们想要更紧凑
  • 哈。我真的很喜欢这个。它也不需要破解来处理push_backvoid
  • @Bathsheba 是的。我在想如果使用你的解决方案,然后我记得我可以在增量步骤中做到这一点。
  • @Klaus:不存在没有问题的解决方案,例如 OP 提供的代码 ;-)
【解决方案2】:

或多或少,把一切都放在条件?

你可以这样做

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

之所以有效,是因为&amp;&amp; 被短路,并且因为逗号运算符计算第一个操作数,丢弃结果并返回第二个操作数的结果。

所以这是可能的,但你为什么要这样做呢?使代码尽可能密集对可读性几乎没有好处(实际上您的原始代码更具可读性并且使用更少的字符)。

【讨论】:

    【解决方案3】:

    嗯,以一些混淆为代价,

    while (getline(cin, Line) && (Text.push_back(Line), 1));
    

    会这样做:注意表达式分隔符运算符的使用,非正式地说,它会将push_backvoid返回类型“转换”为int,因此可以将其与短路&amp;&amp;

    但根据经验,使用语言,而不是反对它。我的答案是后者。您在问题中呈现代码的方式就足够了。

    【讨论】:

    • 使用晦涩的好例子 ;)
    【解决方案4】:

    冒着“但这正是 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&lt;S&gt; 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 经常写这个确切的代码,它显然应该是一个单独的函数。但即使不是,“大量其他代码”示例也将从该抽象中受益。

    【讨论】:

      【解决方案5】:

      使用一条指令循环。一行可以写但是不推荐

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

      【讨论】:

      • “循环是一条指令”是什么意思?
      • 与OP给出的代码相同。离开牙套通常是个坏主意!
      • Sorry with and not is :) 我写得太快了抱歉。