2017-02-03 62 views
0

在C++中创建n元组列表的方式是什么?我想生成,给定数字的阵列,从该阵列元件的所有可能的n元组:C++中的n元组列表

在数学这与完成的:例如

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通过(见How to create N-tuples in Python?

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

不过我做的Ca没有弄清楚如何在C++中做到这一点。我想有一个数组[0,1,...,num]并生成一个指定长度的n元组。

也许在C++中可能使用std :: next_permutation或者一些嵌套的for?

+0

你真的需要一个元组?看起来像一个2D矢量将为你工作。 – NathanOliver

+0

只是一个想法:也许你可以使用递归函数自己写? – supinf

+0

一个2D矢量将是完美的!不过,我的问题是如何以最有效的方式生成上述序列。递归函数正是我想要做的......但我无法弄清楚如何去做 – Galuoises

回答

1

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

你注意到这些元组是如何像增加数字一样出现的吗?我们可以利用这个事实来做到这一点。

首先,认识到我们从元组中拉元组的设置基本上构成了我们的“数字系统”中的“数字”。所以我们知道我们将有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; 
} 

Demo

+0

谢谢!它完美的工作! – Galuoises