如何创建一个新向量,其中每个元素必须从许多向量中计算出来?

时间:2019-04-26 04:56:26

标签: c++

我有一个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;
  }
}

1 个答案:

答案 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);
}