用循环更改变量名称

时间:2009-06-09 07:55:20

标签: c++

有没有办法不使用数组用循环编写以下内容:

cout<<"This variable c1 ="c1
cout<<"This variable c2 ="c2
cout<<"This variable c3 ="c3

for(i=1,i<8,i++)
cout<<"This variable c%d =",i<<**????**<<

这显然不是我需要做的事情,但这是我能想到同样问题的最简单的例子...... 所以我想做的是改变循环中的变量,而不是输出!

编辑: 非常感谢所有输入, 这里有一些代码来帮助说明我的问题......我在C ++中使用Cplex。 循环不会在7结束,但是当满足停止标准时

static void  populatebyrow (IloModel model, IloNumVarArray x, IloRangeArray c)
{
    IloExpr c1(env);
    IloExpr c2(env);
    IloExpr c3(env);
    IloExpr c4(env);

    c.add(c1>=n);
    c.add(c2>=n); ...

    model.add(c);
}

我想将这些表达式添加到名为c的数组中,该数组将作为cplex中模型的输入。 然后我从Cplex得到一个结果后,我想添加一个表达式c(i)并再次解决它... 直到我得到我想要的价值...... IloExprArray也可以某种方式使用,但后来我不知道如何使用这种方法添加表达式:

for(i= 0,...)
{
    c7 +=x[i];
}

9 个答案:

答案 0 :(得分:10)

如果我理解正确,您正在尝试动态创建变量名称。 AFAIK使用C ++是不可能的。

答案 1 :(得分:9)

我建议使用数组。您不应该使用编译语言来使用动态变量名称。

int c[] = {2, 5, 7, 9, 3, 4, 6, 5};
for (int i = 0; i < 8; i++) cout // and so on...

答案 2 :(得分:6)

int* varArray[] = {&c1, &c2, &c3};
int size = sizeof( varArray) / sizeof(int*);

for( int i = 0; i < size; ++i)
{
   std::cout << "This variable c"<< i+1 << " = " << *varArray[i] << std::endl;
}

答案 3 :(得分:1)

如果你想在词汇上做任何事情,你就会陷入困境。请理解这是可怕且不可维护的,但如果你坚持,你可以做这样的事情:

#define Q(a) a
#define DO_THING(a, expr) do { Q(a)1 expr; Q(a)2 expr; Q(a)3 expr; Q(a)4 expr } while (0)

DO_THING(b, [i] = i);

这导致代码:

do { b1  [i] = i; b2  [i] = i; b3  [i] = i; b4  [i] = i } while (0);

写完所有内容后,请不要这样做。即使你将它包装在更多的宏中以使其具有准可读性,请以常识为准并放弃此计划。

答案 4 :(得分:0)

如果你真的不能使用数组,为什么不尝试使用指针。我知道以下示例本质上是一个数组,但它稍有不同,所以它可能值得一试。

#include <iostream>
#include <conio.h>

#define N 10

using namespace std;

int main() {

    int * a = new int[N];

    for (int i = 0, * b = a; i < N; i++, b++) {
        *b = i;    
    }


    for (int i = 0, * b = a; i < N; i++, b++) {
        cout << *b << endl;
    }

    getch();
}

这仍然是一个数组,但它的使用略有不同,可能就是你想要的。如果不是,请澄清您的问题,以便我们为您提供帮助。即使这是您能想到的最简单的例子,也可以尝试添加更多细节。

编辑我刚看到(在评论中)您试图动态创建变量名称。据我所知,这是不可能的,但你可以尝试实现(或使用一个库,我相信那里有很多)a HashMap。使用散列映射,您可以将项目链接到字符串(键),这样您就可以将项目链接到用户输入的自定义字符串(假设您需要这样做)。

答案 5 :(得分:0)

我总是了解到,如果“变量变量名称”就是答案,那么你就会问错误的问题。它可以用不同的方式解决。

答案 6 :(得分:0)

利用或元编程计算?

#include <iostream>
template<unsigned U>
struct Fac{ enum { value = U * Fac<U-1>::value};};
template<>
struct Fac<0>{ enum { value = 1};};
template<unsigned U>
struct Fib{ enum {value = (Fib<U-1>::value + Fib<U-2>::value)};};
template<>
struct Fib<0>{ enum {value = 0};};
template<>
struct Fib<1>{ enum {value = 1};};
template<unsigned U>
void show(){
    show<U-1>();
    std::cout << "Fib(" << U << ")=" << Fib<U>::value << "\t" << "Fac(" << U << ")=" << Fac<U>::value << std::endl;
}
template<>
void show<0>(){}

int main(int argc, char** argv){
    show<12>();
}

还可以使用boost预处理器扩展,因此您可以循环宏来生成标识符。

答案 7 :(得分:0)

这是使用预处理器运算符##和宏在c / c ++中执行此操作的方法 在此链接上有使用示例 http://msdn.microsoft.com/en-us/library/09dwwt6y(v=vs.80).aspx

答案 8 :(得分:0)

我使用过这个功能,效果很好:

 IloNumVarArray x(env, 10);

 for(i=0; i<10; i++){
   x[i] = IloNumVar(env, 0, IloInfinity); 

   // Code for change the name of each variable
   char index[2]; 
   sprintf(index, "%d", i); 
   char variable_name[6] = "x"; 
   strcat(variable_name, index); 
   x[i].setName(variable_name);
 }