我可以使用reduce代替for循环吗?

时间:2019-05-14 08:03:26

标签: c++ c++17

我有一个hashSet,具有0到X个数字和高整数值。
0:1000000001
1:1000000002
...

和位置向量(22,14,29,59,10)。 我需要生成此向量的所有组合。 为此,我使用https://github.com/mraggi/discreture中的库进行生成。我得到了矢量大小和need_comb_size的所有组合
如(10,3)
0,1,2
0,1,3
...

现在我将生成的组合与我的矢量位置和hashSet链接起来 hashSet [vect [comb [0]] + ...

我可以与reduce一起使用它吗?

目标是生成一个高整数(哈希),并将此哈希用作键,并使用梳子示例中的位置:(12,59,11)作为值。
3423422821:矢量(((12,59,11)<-位置,(3,19,299,490)<-尺寸)。如果梳子在任何维度上具有相同的签名,则将添加该维度。

void combination(int size, vector<unsigned short> chunk, vector<unsigned long long> hashSet, unordered_map<unsigned long long, pair<vector<unsigned short>, vector<unsigned short>>> collision_map, unsigned long long low, unsigned long long high, int dimension) {
    for (auto&& comb : discreture::combinations_stack(size,KCOMB))
    {
        unsigned long long signature = 0;
        vector<unsigned short> newChunk;
        //signature = reduce(std::execution::par, comb.begin(), comb.end())
        for (auto v : comb) {
            signature += hashSet.at(chunk.at(v));
            newChunk.push_back(chunk.at(v));
        }
        checkSignature(low, high, signature, collision_map, newChunk, dimension);
    }
}

1 个答案:

答案 0 :(得分:2)

请注意,std::reduce有一个警告

  

如果binary_op不具有关联性或不具有可交换性,则该行为是不确定的。

如果您关心newChunk中元素的顺序,则不能在内部循环中使用reduce

如果您关心对checkSignature的调用顺序,则不能在外部循环中使用reduce,否则您仍然必须综合一个值以将其丢弃,因为您不能通过void作为累加器。