Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将字符串和正在运行的索引连接到循环中的字符串中_C++_Concatenation_Root Framework - Fatal编程技术网

C++ 将字符串和正在运行的索引连接到循环中的字符串中

C++ 将字符串和正在运行的索引连接到循环中的字符串中,c++,concatenation,root-framework,C++,Concatenation,Root Framework,要使用给定的图形包,我需要定义、预订和填充直方图。 如何获取直方图的名称,它是一个要连接的字符串 将2整数作为字符串(hts_i_j)替换为3 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<

要使用给定的图形包,我需要定义、预订和填充直方图。 如何获取直方图的名称,它是一个要连接的字符串 将2整数作为字符串(hts_i_j)替换为3 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.);
相反,我想定义、预订并填写3个for循环。 例如


<标准> C++中的字符串流(int i=5,i)是字符串格式的基本解决方案:

std::ostringstream os;
os << "hts_" << i << "_" << j;
我不清楚为什么首先需要将索引存储在字符串中


旁注:如果你正在学习一本没有涉及字符串格式和容器合理使用的书,请选择一本好的入门书。

我不太理解你的问题

在为“books”声明变量后,您将如何处理它们?如果您将它们放入某种集合中,可能不需要为每个集合声明一个变量。只需在内部for循环中声明一个泛型变量,根据需要分配它,然后将其放入所需的任何集合中即可


或者,如果你有一个程序只需要处理几本书,那么就按照你现在的方式去做,不需要循环。只需手动声明每一本就可以了。

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

你所做的也许更好地解决了一个强数组> <强>。定义一个数组名称<代码> HTS< /Cord>,它具有你需要的维度。C++数组总是从0索引,但是你的最低界限看起来是五。你可以在使用索引的时候从所有索引中减去五,或者你可以让你的数组五个ELEM。然后“扔掉”较低的元素

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.);
  }
}
另一个选项是使用
从字符串映射到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.));
  }
}
//带宏的字符串concat
#定义高温超导(i,j)高温超导(i,j)
//用法
//声明变量
TH1F*高温超导(5,53);
TH1F*高温超导(5,54);
//但请注意,下面生成的是变量hts_k_l,而不是hts_8_9;
int k=8;
int l=9;
TH1F*HTS_Uk(k,l);
//使用你的变量
hts_5_53=HDir.make(“hts_5_53”),“Title”,100,0,100.);
hts_5_54=HDir.make(“hts_5_54”),“Title”,100,0,100.);
我认为Boost.预处理器能够在“循环”中使用它


然而,我无法想象所有这些都适用于什么:)它通常是用数组来完成的

您能重新格式化它以使其可读吗?在每个代码行前面放四个空格,它会适当地缩进。阅读了解详细信息。强制性的boost建议:
std::string s=“hts_u”+boost::lexical_cast(i)+“”+boost::lexical_cast(j)
(我相信在boost中也有更好的方法来实现这一点……也许是格式化字符串?)@Dan:按照强制性替代方案的链接进行操作-这里已经讨论过了。@gf:哦,天哪,我很抱歉。我甚至没有注意到链接。OTOH我很高兴你指出了这一点——这让我很恼火,我无法轻松地使用stringstream来完成我过去使用strstream(格式化为堆栈分配的缓冲区)轻松完成的工作。我提到boosthalf只是个玩笑,但也有类似的选择。
for (int i=5; i<17; ++i) {
    for (int j=53; j<70; ++j) {
       hts[i][j] = f(str); 
    } 
}
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.);
  }
}
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.);
  }
}
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);
//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.);