如何在C++17中从给定vector生成指定长度的排列变体?
在C++17中生成指定长度的排列变体
在C++17中,标准库没有直接提供生成指定长度排列变体的工具函数,但可以通过回溯法快速实现需求,这种方法逻辑直观且效率较高。
以下是符合要求的get_variations函数实现:
#include <vector> #include <iostream> void get_variations(int len, const std::vector<int> &array, std::vector<std::vector<int>> &result) { result.clear(); if (len <= 0 || len > array.size()) { return; } std::vector<bool> used(array.size(), false); std::vector<int> current; // 回溯辅助函数 auto backtrack = [&](auto &&self) -> void { if (current.size() == len) { result.push_back(current); return; } for (size_t i = 0; i < array.size(); ++i) { if (!used[i]) { used[i] = true; current.push_back(array[i]); self(self); current.pop_back(); used[i] = false; } } }; backtrack(backtrack); } int main() { std::vector<std::vector<int>> result; std::vector<int> array = {1, 2, 3}; get_variations(2, array, result); for(auto variation : result) { for(auto element : variation) { std::cout << element << ' '; } std::cout << std::endl; } }
代码说明
- 先做输入合法性校验:若指定长度
len小于等于0或超过原数组长度,直接返回空结果。 - 用
used数组标记原数组中已被选中的元素,避免重复选取同一元素。 - 借助C++17支持的递归lambda实现回溯逻辑:每次选择一个未被使用的元素加入当前路径
current,当路径长度达到len时,将其存入结果集;之后回溯(移除当前元素并取消标记),继续尝试其他组合。
运行结果
执行代码后会输出预期的排列变体:
1 2 1 3 2 1 2 3 3 1 3 2
内容的提问来源于stack exchange,提问作者Parzival
相关产品推荐
相关产品推荐

