如何在S ++中使用STL在低于总长度的位数上创建排列

问题描述 投票:5回答:1

我有一个c++ vectorstd::pair<unsigned long, unsigned long>个对象。我正在尝试使用std::next_permute()生成矢量对象的排列。但是,我希望排列的大小是给定的,类似于python中的permutations函数,其中指定了预期返回的排列的大小。

基本上,相当于[c++] >>

import itertools

list = [1,2,3,4,5,6,7]
for permutation in itertools.permutations(list, 3):
    print(permutation)

我有一个带有std :: pair 对象的c ++向量。我正在尝试使用std :: next_permute()生成矢量对象的排列。但是,我想要...

python c++ permutation
1个回答
0
投票

如果效率不是主要考虑因素,我们可以遍历所有排列并跳过重复的排列:

std::size_t fact(std::size_t n) {
    std::size_t f = 1;
    for (; n > 0; --n)
        f *= n;
    return f;
}

int main() {
    std::vector<int> vec{1, 2, 3, 4};
    std::size_t k = 2;

    const std::size_t m = fact(vec.size() - k);
    std::size_t n = 0;
    do {
        if (n == 0) {
            for (std::size_t i = 0; i < k; ++i) // print first k entries
                std::cout << vec[i];
            std::cout << std::endl;
        }

        if (++n == m)
            n = 0;
    }
    while (std::next_permutation(vec.begin(), vec.end()));
}
© www.soinside.com 2019 - 2024. All rights reserved.