用C ++生成一组整数的排列。获取分段错误

时间:2014-02-16 20:52:55

标签: c++ recursion stl set

我试图解决一个涉及产生一组数字的所有排列的问题。这个想法似乎很简单(下面的代码),但我不断得到分段错误。谁能告诉我我做错了什么?

void permute(set<int>& s, vector<int>& v) {
    if(s.empty()) {
        // read the permutation in v.
        return;
    }
    set<int>::iterator i;
    for(i = s.begin(); i != s.end(); i++) {
        int x = *i;
        s.erase(i);
        v.push_back(x);
        permute(s, v);
        v.pop_back();
        s.insert(x);
    }
}

3 个答案:

答案 0 :(得分:1)

要在C ++中使用std::next_permutation生成所有排列。这里的问题是你不能置换集合,因为键比较器操作符(在你的情况下是小于运算符)的排序是预置。你可以做的是将你的值存储在一个非关联容器中,然后去吧。

#include <set>
#include <algorithm>
#include <iterator>
#include <vector>

using namespace std;

void permut(std::set<int> const &inp, std::vector<int> &all_permutations)
{
    vector<int> tmp(inp.size());
    copy(inp.begin(), inp.end(), tmp.begin());

    vector<int> all_permutations;
    do 
    {
        copy(tmp.begin(), tmp.end(), back_inserter(all_permutations));
    } while (std::next_permutation(tmp.begin(), tmp.end()));
}

答案 1 :(得分:-2)

permute()函数在迭代可变容器并进行更改时递归调用自身。这违反了迭代器有效性承诺。

你可以尝试一下基于std :: next_permutation()的东西

答案 2 :(得分:-2)

我没有进入你可以从集合中获得的精确行为,但是很明显你在for循环中所做的事情足以使迭代器无效。我建议你重新设计一些东西,这样你就可以有两套,然后通过一套(从完全开始),同时在另一套中生成排列(从空开始)。