C++ 中的 n 元组列表
List of n-tuples in c++
在
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;
}
演示
相关文章:
- Pybind11:将元组列表从Python传递到C++
- 在函数呼叫时,请从异质初始化列表中构建元组
- C++ 中的 n 元组列表
- 从c++向python返回复杂列表的元组
- 有没有一种方法可以将左值和右值的列表分别转换为具有引用类型和完整类型的元组
- 如何将函数应用于可变参数列表并将它们猫到元组
- 从类型列表创建向量元组
- 初始化类成员初始值设定项列表中的向量元组
- 将元组传递给函数并让它返回数字列表的最佳方法
- 返回 vector<pair<int,int>> & from c++ 方法到 python 使用 swig typemap 的元组列表
- 成员初始值设定项列表:从返回元组的函数初始化两个成员
- 多类型容器(数组/向量/列表)传统上是如何在C++实现的?(当然没有元组)
- 如何创建类型列表以扩展到元组
- 将元组列表传递到C++函数中
- C++使用谓词查找元组列表中的元素
- 用于存储元组键的数据结构:参数关系列表
- 托管C++中的列表<元组<int,浮点>>
- 如何在c++中获得基于可变大小的模板模板列表的元组
- 解压缩元组列表
- 在c++中对列表中的一对(或元组)的特定项进行迭代