【问题标题】:C++ how to declare a "complex" object inside a loop? [closed]C++ 如何在循环中声明一个“复杂”对象? [关闭]
【发布时间】:2020-08-04 16:15:28
【问题描述】:

编辑:正如@HolyBlackCat 所述 “如果你需要它在迭代之间保留它的 [a variable's] 值,它必须留在外面。”这当然适用于原始类型,例如。诠释。所以这个问题实际上只是噪音,对不起。

我试图弄清楚如何在声明对象时保持一致,即“在循环内部或外部声明变量?”仅在循环内使用的变量的问题。参见例如。 Declaring variables inside loops, good practice or bad practice?.

考虑以下示例。让 V 成为一个具有默认构造函数的对象。

                                  // Example 1
std::vector<int> V;               // Works as intended
for (int i=0; i<2; i++) {         // ...but V should be declared inside loop(?)
    V.push_back(i);
    // V used only inside loop
}                                 
                                  // Example 2 
for (int i=0; i<2; i++) {         // OK Syntax, Wrong Semantics
    std::vector<int> V;           // V is "created" anew in each loop-step
    V.push_back(i);
    // V used only inside loop         
}
                                  // Example 3
for (int i=0; i<2; i++) {         // Syntax Error, other syntax possible?
    std::vector<int> V.push_back(i);
    // V used only inside loop 
}

示例 1:定义我正在寻找的近似语义 - 除了 V 是循环本地的,我更愿意在循环内定义 V。

示例 2:在循环内定义 V,但也在每个循环步骤中重新创建它,这不是所需的语义。

示例 3:“很好的尝试”语法探索 - 我试图声明并“立即使用”对象 V。这是非法语法。

如果在一天结束时,许多类型的对象都在循环外最优雅地声明(就像示例中的 V 一样;否则,如果在循环内声明,则声明将以某种方式“被保护”)然后我可能只是倾向于在循环之外声明所有内容,就在循环之前,而不是在循环内部......

请就这个问题给我建议,如何获得示例 1 的语义,但在循环内声明 V(如果可能)。

【问题讨论】:

  • 是的,可以使用另一种语法:for (int i=0; i&lt;2; i++) { std::vector&lt;int&gt;().push_back(i); } 虽然不能命名为 V,但未命名的向量只存在于语句的 ; 之前。
  • 但这实现了什么呢?目前还不清楚你想要实际发生什么。
  • 不要为此感到压力。养成尽可能在本地声明事物的习惯,你会没事的。
  • 标记为“OK”的 sn-p 是在 C++ 中执行此操作的正确方法。如前所述,标记为“不起作用”的部分在 C++ 中不起作用,并且替代方案(如使用 lambda)不会满足意图。用“OK”的方式,没关系。
  • (“行不通”的方式与你的激励性问题无关。有点牵强附会。我们中的一些人——包括我自己——对此很感兴趣。对此感到抱歉。)

标签: c++ scope variable-declaration object-initialization


【解决方案1】:

是的,您可以这样做:

std::vector<int> V{i}; 

它在声明向量V 时将其初始化为i


另一方面,您的两个循环实际上都没有做任何有用的事情。您每次都在循环内重新声明 V ,因此以前的 push_backs 不可见。此外,Vfor 循环范围之外是不可用的。

看来您正在尝试用计数填充向量。最简单的方法是:

std::vector<int> V(2);
std::iota(V.begin(), V.end(), 0);

【讨论】:

  • 但不会像示例中那样增长 V?
  • 你的例子也没有增长V。您每次都在循环内重新声明 V
  • 另一种选择是使用std::vector&lt;int&gt; V(1, i);。但我能想到的唯一优势是它可以与 C++11 之前的编译器一起使用。
  • @newbie 一般规则是尽可能晚地声明一个变量,是的。但是如果你需要它在循环之外,那么在里面声明它是不可能的。
  • @newbie 如果你需要它在迭代之间保持它的价值,它必须留在外面。
【解决方案2】:

您每次都尝试声明一个新向量并直接使用push_back on 声明,这是不可能的,即声明:

是否可以在同一个声明语句中声明并立即使用对象 V

不正确。

【讨论】:

  • 好吧,如果你不使用声明本身,而是做一个临时声明;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多