2010-05-03 61 views
0

要使用給定的圖形包,我需要定義,預訂和填充直方圖。 如何獲得直方圖的名稱,該直方圖是將3個for循環中的2個整數作爲字符串(hts_i_j)連接起來的 而不是連接。 已在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(int i=5, i<17, ++i){ 
    for(int j=53, j<70, ++j){ 

    hts_i_j 

} 
} 

如何可以獲得字符串HTS與 指數(I,J)是一個簡單的短路,同時限定, 預訂和在3 for循環代替

+0

你能重新格式化該使它是可讀的?在每個代碼行的前面放置四個空格,並將其適當縮進。詳情請閱讀http://stackoverflow.com/editing-help。 – 2010-05-03 18:57:28

回答

0

填充在標準C++串串聯流是對字符串格式化鹼性溶液:

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

檢索結果字符串與os.str()。有關替代方案的討論,請參閱The string formatters of Manor farm

使用得到的字符串和合適的container,您的循環可以例如成爲:

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

爲什麼然而你需要將索引存儲在字符串中的第一位對我來說是不明確的。

側面說明:如果從一本書,不包括字符串格式化和合理利用集裝箱的學習,選擇好的介紹一個from SOs book guide

+0

強制推薦:'std :: string s =「hts_」+ boost :: lexical_cast (i)+「_」+ boost :: lexical_cast (j);'(我確信有更好的方法可以在提升中也是這樣做的...格式化字符串可能嗎?) – Dan 2010-05-03 19:04:01

+0

@Dan:按照鏈接提供強制替代方法 - 其已在其中討論過。 – 2010-05-03 19:06:14

+0

@gf:哦,天哪,我的道歉。我甚至沒有注意到這個鏈接。 OTOH我很高興你指出了它 - 它讓我感到困惑,我無法輕鬆地用stringstream做我以前用strstream毫不費力地做的事情(格式化成堆棧分配的緩衝區)。我提到boost一半是一個笑話,但也有像http://www.boost.org/doc/libs/1_42_0/libs/format/doc/format.html這樣的選項。 – Dan 2010-05-03 21:25:52

0

我真的不明白你的問題。

在你爲他們聲明變量後,你在做什麼「書」?如果您將它們置於某種集合中,則可能不需要爲每個集合聲明一個變量。只需在inner for循環內聲明一個通用變量,根據需要將其分配,並將其放入所需的任何集合中。

或者,如果您有一個程序需要與少數書籍一起工作,那麼請按照您現在這樣做的方式進行操作,不要使用循環。只需手動聲明每一個。

1

您不能在代碼中構造字符串,然後使用這些名稱返回具有這些名稱的變量。編譯器將程序構建爲可執行代碼時拋出變量的名稱。

你在做什麼可能更好地解決陣列。定義具有所需尺寸的數組名稱hts。C++數組始終從零開始索引,但最低限度似乎爲五。你可以在你使用它們的時候從你的所有索引中減去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.); 
    } 
} 

另一種選擇是使用由串的map您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); 
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是能夠在「循環」

不過,我無法想象這一切可以應用於:)它與陣列進行使用它通常