C++ 如何在循环内声明一个 "complex" 对象?
C++ how to declare a "complex" object inside a loop?
编辑:如@HolyBlackCat 所述
“如果你需要它在迭代之间保留它的[变量]值,它必须留在外面。”这当然适用于原始类型,例如。诠释。所以这个问题实际上只是噪音,抱歉。
我正在努力思考如何在声明对象时保持一致,“在循环内部或外部声明变量?”仅在循环内使用的变量的问题。见例如。 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(如果可能)。
是的,你可以这样做:
std::vector<int> V{i};
它在声明时用值 i
初始化向量 V
。
另一方面,您的两个循环实际上都没有做任何有用的事情。您每次都在循环内重新声明 V,因此之前的 push_backs 不可见。此外,V
在 for
循环范围之外不可用。
看来您要做的是用计数填充向量。最简单的方法是:
std::vector<int> V(2);
std::iota(V.begin(), V.end(), 0);
你试图每次都声明一个新的向量并直接使用 push_back
声明,这是不可能的,即声明:
is it possible to declare and immediately use the object V, in the very same declarative statement
不正确。
编辑:如@HolyBlackCat 所述 “如果你需要它在迭代之间保留它的[变量]值,它必须留在外面。”这当然适用于原始类型,例如。诠释。所以这个问题实际上只是噪音,抱歉。
我正在努力思考如何在声明对象时保持一致,“在循环内部或外部声明变量?”仅在循环内使用的变量的问题。见例如。 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(如果可能)。
是的,你可以这样做:
std::vector<int> V{i};
它在声明时用值 i
初始化向量 V
。
另一方面,您的两个循环实际上都没有做任何有用的事情。您每次都在循环内重新声明 V,因此之前的 push_backs 不可见。此外,V
在 for
循环范围之外不可用。
看来您要做的是用计数填充向量。最简单的方法是:
std::vector<int> V(2);
std::iota(V.begin(), V.end(), 0);
你试图每次都声明一个新的向量并直接使用 push_back
声明,这是不可能的,即声明:
is it possible to declare and immediately use the object V, in the very same declarative statement
不正确。