我有一個包含元素向量的結構:
struct SomeStruct
{
std::vector<Element> vec;
};
每個元素包含一個容器:
struct Element
{
Container m_container;
};
向量可以包含 3、4 或 5 個Elements。這是有保證的。
如果有 3 個專案,則下一階段包含一系列 3 個嵌套for回圈(見下文)。具有 4 個元素的向量需要 4 個回圈、5 -> 5 個回圈等。只有 3、4 或 5 個回圈。
我必須省略一些代碼,但回圈中的邏輯以將雙精度數相乘并計算最小值作為結論。所以最里面的回圈需要訪問早期回圈中的區域變數。
for(const auto& x : vec[0].m_container)
{
const double some_calc = some_func(x);
for(const auto& y : vec[1].m_container)
{
const double some_calc_2 = some_func(y);
for(const auto& z : vec[2].m_container)
{
const double some_calc_3 = some_func(z);
// TODO need a way to generate 4th and 5th loops if required
// Logic processing data from the 3 loops
const double a_calculation = some_calc * some_calc_2 * some_calc_3;
double a_min = some_calc;
a_min = std::min(a_min, some_calc_2);
a_min = std::min(a_min, some_calc_3);
}
}
}
有沒有一種方法可以根據向量的大小自動化/生成這些嵌套的 FOR 回圈?我在想這樣的模板:
if(struct.vec.size() == 3)
{
the_answer<3>(struct.vec);
}
else if(struct.vec.size() == 4)
{
the_answer<4>(struct.vec);
}
else
{
the_answer<5>(struct.vec);
}
uj5u.com熱心網友回復:
大多數情況下,您可以通過遞回來解決這個問題。所以
void loop(int n,const vector<double>& vec, vector<double> outer_vars){
if (n!=vec.size()){
for(const auto& z : vec[n]){
outer_vars.push_back(some_func(z));
loop(n 1,vec,outer_vars);
}
}
}
uj5u.com熱心網友回復:
這可以通過遞回函式來完成。
void loop(const std::vector<Element>& vec, size_t idx) {
if (idx 1 == vec.size()) {
for (const auto& z : vec[idx].m_container) {
const double some_calc = some_func(z);
// Logic processing data from the innermost loop
const double a_calculation = some_calc * some_calc_2 * some_calc_3;
double a_min = some_calc;
a_min = std::min(a_min, some_calc_2);
a_min = std::min(a_min, some_calc_3);
}
} else {
for (const auto& z : vec[idx].m_container) {
const double some_calc = some_func(z);
loop(vec, idx 1);
}
}
}
某處開始
loop(vec, 0);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/515586.html
標籤:C 模板c 20
上一篇:WCF“預計會有更多資料,但已達到EOF。”客戶端例外,但請求在服務器端命中
下一篇:模板類如何決議成員方法
