2012-02-20 3 views
0

C++ユーティリティの作成にヒントが必要です。 私は最適化アルゴリズムを実装しています。特定のステップでは、サイクルの繰り返しと同じくらい多くの新しい変数を作成する必要があります。 より良い、それを説明するだろういくつかのコードがあります:構造nodoは次のように定義されてサイクル中に変数の名前を指すインデックスを使用するC++

for(int i=1;i<112;i++){ 
    struct nodo n_2i[111-i];   
} 

struct nodo{ 
    int last_prod; 
    int last_slot; 
    float Z_L; 
    float Z_U; 
    float g; 
    bool fathomed; 
}; 

私はn_21する新しい変数(構造体の配列)の名前をしたいと思い、n_22 、n_23、...など。 どうすれば対応できますか?

+1

をあなたが動的に変数名を生成できませんhttp://stackoverflow.com/questions/968725/change-variable-name-with-a-loop –

答えて

3

は、なぜあなたは名前が必要です。あなたはベクトルのベクトルを使用することができます。

#include <vector> 
using namespace std; 
int main() { 
    vector<vector<struct nodo> > n; 
    for(int i=1;i<112;i++){ 
     n.push_back(vector<struct nodo>(111-i));  
    } 
    // you can use n[0] ... n[111] now 
} 
+0

私は彼が1次元のベクトルを必要とすると思います。 –

+0

私はそれが私の必要と思うものです。私がそれを真っ直ぐにすると、今は 'n [0]、n [1] ...'はベクトルを参照しています。しかし、どのようにすれば、今、n [i]のメンバーにアクセスできますか? – MarcoBi

+0

@Adeは動作しません。 push_backの後の '(111-i)'コードは、新しい要素のサイズにとどまりますか? – MarcoBi

0

std::map<string,struct nodo*>を使用して、要素を保持したい場合があります。

また、長さがiに依存する静的変数を宣言することはできません(例では、std::vectorが必要です)、または動的にメモリを割り当てることに注意してください。

あなたがvectorを使用する場合は、あなたのマップは、あなたが実行時に新しい変数名を宣言することはできませんタイプmap<string,vector<struct node> >

1

のものであろう。変数のstd::vectorを作成することをお勧めします。

+0

実際、私はそれがOPが求めているとは思っていません。私は彼が配列のセットを作成したいと思います。それぞれの配列は異なる名前を持っています: '[1122]'のそれぞれの 'n_2i' – amit

+0

' std :: vector'の良い点は、使用前に必要なスペースを確保する。 –

+0

@amitできない。配列の名前は何ですか?確かにマップのキーではありません... –

0

マップはあなたのためにそれを行う必要があります:n_21をする

std::map<string, struct nodo*> n_2i; 
1

コードがコンパイルされると、変数名は存在しなくなります。コンパイル時には、ループは単一の構文であり(展開されない限り)、同じコンパイル時の要素(、変数)を参照する異なる名前を持つことは意味がありません。全体的な質問はほとんど意味がありません。それぞれの反復で変更する必要のない単一の変数を良い名前で提供することをお勧めします。

また、C++には可変サイズの配列はありません。つまり、一部のコンパイラだけが受け入れるC99構造です。そのため、必要な最大サイズの配列を定数として初期化するアレイの位置のうちのどれだけが有効であるかを制御する各反復で使用されます。サイズの上限がない場合は、ループに入る前に動的にメモリを割り当て、最後の反復を完了した後で解放することができます。 (各反復で再配分の費用を避けるために、前のステップの結果を確認する必要がある場合を除き、ある

...

0

を私がのstd ::マップはここに役立つと信じている:。

std::map< int , std::vector< struct nodo > > n; 
for(int i=1;i<112;i++){ 
    n.insert(std::make_pair(i, std::vector<struct nodo>(111-i)));  
} 

あなたは、インデックス使用と後の値にアクセスできます。

n[0].SomeProperty; 
関連する問題