要使用给定的图形包,我需要定义,预订和填充直方图。 如何获取直方图的名称,该直方图是要连接的字符串 使用2个整数作为字符串(hts_i_j)在3 for for循环中。 这必须用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
}
}
如何让字符串hts与...连接 索引(i,j)在定义时以简单的方式进行, 预订并填写3 for for循环
答案 0 :(得分:1)
您无法在代码中构造字符串,然后使用这些名称返回具有这些名称的变量。编译器在将程序构建为可执行代码时抛弃变量的名称。
使用数组可能更好地解决了您正在做的事情。定义具有所需维度的数组名称hts
。 C ++数组始终从零开始索引,但您的最低边界似乎是五。无论何时使用它们,你都可以从你的所有索引中减去五个,或者你可以让你的数组中的五个元素更长,并“抛弃”下面的元素。
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);
答案 1 :(得分: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。
答案 2 :(得分:0)
我真的不明白你的问题。
在为它们声明变量后,您对“书籍”做了什么?如果要将它们放在某种集合中,则可能没有必要为每个集合声明一个变量。只需在内部for循环中声明一个泛型变量,根据需要进行分配,并将其放入您需要的任何集合中。
或者,如果你有一个只需要处理少量书籍的程序,那就完全按照你现在的方式进行,没有循环。只需手动声明每一个。
答案 3 :(得分: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能够在“循环”中使用它
然而,我无法想象所有这些都可以应用于:)通常使用数组