C ++:迭代创建变量

时间:2014-12-10 12:16:32

标签: c++ loops variables

我很想知道每次执行循环时是否有办法用新名称创建一个新变量。

例如:

#include <iostream>
int main()
{
    for (int x = 1 ; x<=5 ; x++)
       int a_x;
    return 0;
}

应创建5个新变量,名称为a_1,a_2 ...... a_5

上面的代码只显示了我要找的内容,答案。

编辑: 在不使用数组的情况下寻找出路。

- 有学习意愿的C ++新手:)

3 个答案:

答案 0 :(得分:3)

不,你不能用C ++做到这一点。

在这种情况下,最好的办法是创建int数组并使用for循环填充它们。

int a_x[5];
for (int x = 1 ; x<=5 ; x++)
       a_x[x - 1] = /*ToDo - something*/

请注意

  1. 数组从零开始:你能看到我如何使用x - 1。正常的做法是在x循环中重新定义forfor (int x = 0 ; x < 5; ...

  2. 数组已初始化。您必须填充内容。

答案 1 :(得分:3)

不,没有办法做你已经概述的(直接)。以下是几种可能的替代方案:

  1. 首先,如果您不需要在循环外部访问“变量”,只需使用正常的局部变量:

    for (int x = 1; x <= 5; ++x) {
      int a = whatever;  // This will be freshly redeclared & reinitialised in each iteration
    }
    
  2. 如果在编译时已知迭代的边界,则可以使用数组:

    std::array<int, 5> a;
    for (int x = 0; x < a.size(); ++x) {
      a[x];
    }
    
  3. 如果仅在运行时知道边界,请使用动态数组:

    std::vector<int> a(the_runtime_size);
    for (int x = 0; x < a.size(); ++x) {
      a[x];
    }
    
  4. 如果由于某种原因确实需要单个变量(并且您知道编译时的数字),则可以使用Boost.Preprocessor的预处理器技巧。但那是高于初学者水平:

    #include <boost/preprocessor>
    
    #define DECLARE_MY_VARIABLE(z, idx, name) \
      int BOOST_PP_CAT(name, BOOST_PP_CAT(_, idx));
    
    BOOST_PP_REPEAT(5, DECLARE_MY_VARIABLE, a)
    

    上面的代码将扩展为:

    int a_0; int a_1; int a_2; int a_3; int a_4;
    

    您当然可以进一步采取这几个步骤,让每个变量具有不同的类型,或者通过名称而不是索引来命名。它只需要更多的宏魔法。

    免责声明:除非您非常清楚地知道自己需要,否则不要使用此方法。即便如此,在实际执行此操作之前,请重新考虑两次。如果你仍然这样做,请大量记录。像这样的东西一般应隐藏在一个漂亮的&amp;干净的用户友好界面。

答案 2 :(得分:1)

虽然许多人会认为这是不可能的,但可以通过预处理器来实现。循环计数必须在编译时知道。在这里,我使用Boost预处理器库。 PP_REPEAT的示例几乎完全符合您的要求。

#include <boost/preprocessor/repetition/repeat.hpp>

#define DECL(z, n, text) text ## n = n;

int main()
{
  BOOST_PP_REPEAT(5, DECL, int a_) // expands to int a_0 = 0; int a_1 = 1; ...
  return 0;
}

请记住:肯定不是你想要的。您可能想要使用数组。如果你绝对确定你需要它,请只使用它。