0

特定のグラフィック パッケージを使用するには、ヒストグラムを定義、予約、および入力する必要があります。代わりに、3 つの for ループで文字列 ( hts_i_j ) として 2 つの整数と連結する文字列であるヒストグラムの名前を取得するにはどうすればよいですか。これは c++ で行う必要があります。以下の例を参照してください。

定義します

TH1F* hts_5_53;
TH1F* hts_5_54;
……
TH1F* hts_5_69;

予約する

hts_5_53= HDir.make<TH1F>("hts_5_53")," Title", 100,0.,100.);
hts_5_54->HDir.make<TH1F>("hts_5_54")," Title", 100,0.,100.);
……
hts_16_69->HDir.make<TH1F>("hts_16_69")," Title", 100,0.,100.);

埋める

hts_5_53->Fill(f)
hts_5_54->Fill(f)
……
hts_16_69->Fill(f)

代わりに、3 つの for ループを定義し、予約し、埋めたいと思います。例えば。

for(int i=5, i<17, ++i){
  for(int j=53, j<70, ++j){

   hts_i_j 

 } 
}

代わりに 3 つの for ループを定義、予約、および入力しながら、文字列 hts をインデックス ( i,j) と簡単に連結する方法を取得するにはどうすればよいですか

4

4 に答える 4

1

コードで文字列を作成し、それらの名前を使用してそれらの名前を持つ変数に戻すことはできません。コンパイラは、プログラムを実行可能コードにビルドするときに、変数の名前を破棄します。

あなたがしていることは、おそらくarrayでよりよく解決されます。hts必要な次元を持つ配列名を定義します。C++ 配列は常にゼロからインデックス付けされますが、下限は 5 のようです。使用するたびにすべてのインデックスから 5 を減算するか、配列を 5 要素だけ長くして下位の要素を「捨てる」ことができます。

TH1F* hts[17][70];
for (int i = 5; i < 17; ++i) {
  for (int j = 53; j < 70; ++j) {
    ostringstream name;
    name << "hts_" << i << "_" << j;
    hts[i][j] = HDir.make<TH1F>(name.str()), " Title", 100, 0., 100.);
  }
}

行のどこかに構文エラーがありますmake。ここで修正しようとはしていません。

配列のサイズを最小にするには、使用する前にインデックスをマッサージする必要があります。

int const Offset1 = 5;
int const Offset2 = 53;
TH1F* hts[17-Offset1][70-Offset2];
for (int i = Offset1; i < 17; ++i) {
  for (int j = Offset2; j < 70; ++j) {
    ostringstream name;
    name << "hts_" << i - Offset1 << "_" << j - Offset2;
    hts[i][j] = HDir.make<TH1F>(name.str()), " Title", 100, 0., 100.);
  }
}

別のオプションは、mapfrom 文字列を TH1F オブジェクトに使用することです。

std::map<std::string, TH1F*> hts;
for (int i = 5; i < 17; ++i) {
  for (int j = 53; j < 70; ++j) {
    ostringstream name;
    name << "hts_" << i << "_" << j;
    hts.insert(name.str()), HDir.make<TH1F>(name.str()), " Title", 100, 0., 100.));
  }
}

次に、名前を使用して必要なアイテムにアクセスできます。

hts["hts_5_62"]->Fill(f);
于 2010-05-03T19:17:25.627 に答える
0
//string concat with a macro
#define HTS_(i,j) hts_##i##_##j

//usage
//declare variables    
    TH1F* HTS_(5,53);
    TH1F* HTS_(5,54);
    //but note that the following produces variable hts_k_l, not hts_8_9;
    int k = 8;
    int l = 9;
    TH1F* HTS_(k,l);
    //use your variables
    hts_5_53 = HDir.make<TH1F>("hts_5_53")," Title", 100,0.,100.);
    hts_5_54 =HDir.make<TH1F>("hts_5_54")," Title", 100,0.,100.);

Boost.Preprocessor は「ループ」で使用できると思います

しかし、私はこれが何に適用できるか想像できません:)通常は配列で行われます

于 2010-05-12T10:54:03.867 に答える
0

標準 C++ では、文字列ストリームは文字列フォーマットの基本的なソリューションです。

std::ostringstream os;
os << "hts_" << i << "_" << j;

で結果の文字列を取得しos.str()ます。代替案については、「マナー ファームの文字列フォーマッタ」を参照ください

結果の文字列と適切なcontainerを使用すると、ループは次のようになります。

for (int i=5; i<17; ++i) {
    for (int j=53; j<70; ++j) {
       hts[i][j] = f(str); 
    } 
}

ただし、そもそもインデックスを文字列に格納する必要がある理由は、私にはわかりません。

補足:文字列の書式設定やコンテナーの賢明な使用法を扱っていない本から学んでいる場合は、SO ブック ガイド から適切な入門書を選択してください。

于 2010-05-03T19:01:26.440 に答える
0

あなたの質問がよくわかりません。

それらの変数を宣言した後、「本」で何をしていますか? それらをある種のコレクションに入れる場合、それぞれに対して変数を宣言する必要はないかもしれません。内側の for ループ内でジェネリック変数を宣言し、必要に応じて割り当てて、必要なコレクションに配置するだけです。

または、ほんの一握りの本を操作する必要があるプログラムがある場合は、ループを使用せずに、現在行っている方法とまったく同じように実行します。それぞれを手動で宣言するだけです。

于 2010-05-03T19:02:27.590 に答える