gpt4 book ai didi

c++ - 在循环中将字符串和运行索引连接到字符串中

转载 作者:行者123 更新时间:2023-11-28 08:29:37 30 4
gpt4 key购买 nike

要使用给定的图形包,我需要定义、预订和填充直方图。我怎样才能得到直方图的名称,它是一个要连接的字符串在 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 循环。例如.

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

hts_i_j

}
}

我怎样才能让字符串 hts 与indices ( i, j) 在定义时以简单的简短方式,预订并改为填写 3 个 for 循环

最佳答案

您不能在代码中构造字符串,然后使用这些名称返回具有这些名称的变量。编译器在将您的程序构建为可执行代码时会丢弃变量名称。

使用数组 可能更好地解决您正在做的事情。定义一个数组名称 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.);
}
}

另一种选择是使用从字符串到 TH1F 对象的 map:

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);

关于c++ - 在循环中将字符串和运行索引连接到字符串中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2760422/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com