You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 18:50:26