c++ - 如何从可变数量的 STL vector 创建变量的所有排列

标签 c++ algorithm vector stl

<分区>

我有一个可变数量的std::vectors<int> ,假设我在这个例子中有 3 个 vector :

std::vector<int> vect1 {1,2,3,4,5};
std::vector<int> vect2 {1,2,3,4,5};
std::vector<int> vect3 {1,2,3,4,5};

vector 的值在这里并不重要。此外,这些 vector 的长度是可变的。

从这些 vector 中,我想创建 vector 值的每个排列,所以:

{1, 1, 1}
{1, 1, 2}
{1, 1, 3}
...
...
...
{3, 5, 5}
{4, 5, 5}
{5, 5, 5}

然后我会将每个组合插入到键值对映射中,以供我的应用程序进一步使用。

实现此目标的有效方法是什么?我通常只使用 for循环,遍历所有参数以创建所有组合,但 vector 的数量是可变的。

谢谢。

编辑:我将包含更多细节。

所以,首先,我并不是真的在处理 int s,而是一个自定义对象。 int s 只是为了简单起见。 vector 本身存在于这样的 map 中 std::map<std::string, std::vector<int> > .

我的最终目标是拥有一个 std::vector< std::map< std::string, int > > ,它本质上是名称-值对的所有可能组合的集合。

最佳答案

许多(也许是大多数)形式为“我需要生成 X 的所有排列”的问题都可以通过创造性地使用简单计数来解决(这也不异常(exception))。

让我们从简单的示例开始:3 个 vector ,每个 vector 包含 5 个元素。对于我们的答案,我们将这些 vector 的索引视为一个 3 位、基数 5 的数字。该数字的每个数字都是其中一个 vector 的索引。

因此,要生成所有组合,我们只需从 0 数到 53 (125)。我们将每个数字转换为 3 个基数为 5 的数字,并将这些数字用作 vector 的索引以获得排列。当我们达到 125 时,我们已经枚举了这些 vector 的所有排列。

假设 vector 的长度总是相等的,改变 vector 的长度和/或数量只是改变我们使用的位数和/或数字基数的问题。

如果 vector 的长度不相等,我们只会生成一个结果,其中并非所有数字都在相同的基数中。例如,给定三个长度为 7、4 和 10 的 vector ,我们仍将从 0 计数到 7x4x10 = 280。我们将生成最低有效数字为 N%10。我们将生成下一个最不重要的 (N/10)%4。

大概这足以使如何将概念扩展到任意数量的 vector ,每个 vector 具有任意大小变得相当明显。

关于c++ - 如何从可变数量的 STL vector 创建变量的所有排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21738278/

相关文章:

c++ - Visual Studio 中的 M_PI 问题

algorithm - 如何将 "snap"方向(2D)矢量指向罗盘(N、NE、E、SE、S、SW、W、NW)?

vector - 用两点旋转线

c++ - 如何使用 Visual Studio 2013 CTP 构建 Boost 1.55 2013 年 11 月

c++ - 为什么单例实例必须在下面的代码中初始化

algorithm - 按元素出现删除子列表(方案)

c++ - 访问 vector 时出现运行时错误

c++ - 如何使用 boost::serialization 序列化对象 vector 作为属性的对象

c++ - 静态注册会导致惨败吗

c - 双数组 - C 中的编译时错误