C++ 中的 n 元组列表

List of n-tuples in c++

本文关键字:列表 元组 中的 C++      更新时间:2023-10-16

C++中创建n元组列表的方法是什么?我想在给定一个数字数组的情况下,生成该数组中所有可能的 n 元组元素:

在 Mathematica 中,这是通过以下方式完成的:例如

Tuples[{0, 1, 2}, 3]

生成:

0,0,0
0,0,1
0,0,2
0,1,0
0,1,1
0,1,2
0,2,0
0,2,1
0,2,2
1,0,0
...
2,2,2

在 Python 中是通过(请参阅如何在 Python 中创建 N 元组?)

list(product(range(0, 2), repeat=3))

但是我不知道如何在C++中做到这一点。我想要一个数组 [0,1,...,num] 并生成指定长度的 n 元组。

也许在C++可以使用std::next_permutation或一些嵌套的?

我假设你的数字向量是唯一的。

您是否注意到元组看起来很像递增的数字?我们可以利用这一事实来做到这一点。

首先,意识到我们从中提取元组元素的集合基本上构成了我们"数字系统"中的"数字"。所以我们知道我们将拥有digits^tupleSize元组。

然后,我们只需增加一个计数器并从计数器中拉出"数字"。

#include <cstddef>
#include <cstdint>
#include <vector>
// Not strictly necessary. You can find other ways to end the loop
uint32_t ipow(uint32_t base, uint32_t exp)
{
    uint32_t result = 1;
    while (exp)
    {
        if (exp & 1)
            result *= base;
        exp >>= 1;
        base *= base;
    }
    return result;
}
std::vector<std::vector<uint32_t>> tuples(const std::vector<uint32_t> &set, uint32_t tupleSize)
{
    std::vector<std::vector<uint32_t>> result;
    uint32_t maxValue = ipow(set.size(), tupleSize);
    for (uint32_t counter = 0; counter < maxValue; counter++) {
        std::vector<uint32_t> tuple(tupleSize);
        uint32_t currentValue = counter;
        for (size_t i = 0; i < tupleSize; i++) {
            uint32_t digit = currentValue % set.size();
            tuple[tupleSize - i - 1] = set[digit];
            currentValue /= set.size();
        }
        result.push_back(tuple);
    }
    return result;
}

演示