我有一个join_function,它接受两个元素,并通过更新调用元素来保存结果。例如,如果我有三个初始元素A,B和C,再有一个后面的元素D,则可以使用以下代码。
for (auto it = begin, et = end; it!=et; ++it)
{
later_element N = *it;
D.join_function(N);
}
以上代码将A和D连接起来,将结果保存到D。然后将B和D连接起来并将结果保存到D,依此类推。 for循环遍历所有后续元素。
现在,我的问题是如何使用向量处理相同的问题。我不知道是否会有3个这样的后继元素向量或多或少,但是for循环能够对其进行迭代。向量的大小可以是2:1、2或4或8的幂,依此类推。例如,如果A的大小为2,B的大小为4,C的大小为1,D的大小为2,则新结果向量(例如)E的大小将为16。
通过连接A [0] D [0],B [0] D [0]和C [0] D [0]创建E [0]。 E [1]将为A [0] D [0],B [1] D [0]和C [0] D [0]。 E [2]将是A [0] D [0],B [2] D [0]和C [0] D [0],依此类推,直到覆盖B。然后类似地将覆盖A。当然顺序不是固定的,可以先覆盖A,然后覆盖B,然后覆盖C。一旦使用D [0]覆盖了所有后来的元素,则必须对D [1]重复同样的操作,以此类推。我称D为初始元素。因此,它的循环对我来说很明显,但是后面元素向量的覆盖范围尚不清楚。当initial_element是D向量时,下面的代码对我很清楚。
for (long i=0; i< initial_element.size(); ++i)
{
for (auto it = begin, et = end; it!=et; ++it)
{
later_vector later = *it;
}
}
答案 0 :(得分:0)
您可以存储中间结果,并一次遍历一个输入向量。
using Elems = std::vector</* Your element type*/>;
Elems combine(const Elems & acc, const Elems & next) {
Elems result;
for (auto a : acc) {
for (auto n : next) {
result.push_back(a.join(n));
}
}
return result;
}
然后将它们全部合并为std::accumulate
int main() {
std::vector<Elems> inputs = { A, B, C, D }; // or whatever
Elems E = std::accumulate(inputs.rbegin() + 1, inputs.rend(), inputs.back(), combine);
}