我试图解决一个涉及产生一组数字的所有排列的问题。这个想法似乎很简单(下面的代码),但我不断得到分段错误。谁能告诉我我做错了什么?
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);
}
}
答案 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循环中所做的事情足以使迭代器无效。我建议你重新设计一些东西,这样你就可以有两套,然后通过一套(从完全开始),同时在另一套中生成排列(从空开始)。