这是我正在尝试创建的递归函数,它找到在STL集中传递的所有子集。两个参数是设置为搜索主题的STL,并且数字i> = 0,其指定子集应该有多大。如果整数大于set,则返回空子集
我不认为我这样做是正确的。有时它是对的,有时它不是。 stl集合很好地传递。
list<set<int> > findSub(set<int>& inset, int i)
{
list<set<int> > the_list;
list<set<int> >::iterator el = the_list.begin();
if(inset.size()>i)
{
set<int> tmp_set;
for(int j(0); j<=i;j++)
{
set<int>::iterator first = inset.begin();
tmp_set.insert(*(first));
the_list.push_back(tmp_set);
inset.erase(first);
}
the_list.splice(el,findSub(inset,i));
}
return the_list;
}
答案 0 :(得分:3)
根据我的理解,你实际上是在尝试从给定的集合中生成'i'元素的所有子集吗?
修改输入设置会让你遇到麻烦,最好不要修改它。
我认为这个想法很简单,但我会说你倒退了。因为它看起来像家庭作业,我不会给你一个C ++算法;)
generate_subsets(set, sizeOfSubsets) # I assume sizeOfSubsets cannot be negative
# use a type that enforces this for god's sake!
if sizeOfSubsets is 0 then return {}
else if sizeOfSubsets is 1 then
result = []
for each element in set do result <- result + {element}
return result
else
result = []
baseSubsets = generate_subsets(set, sizeOfSubsets - 1)
for each subset in baseSubssets
for each element in set
if no element in subset then result <- result + { subset + element }
return result
关键点是:
现在,您必须了解这一点,并将其转换为“真正的”代码。
答案 1 :(得分:1)
我一直在盯着这几分钟而且我无法弄清楚你认为 工作的思路是什么。在探索他们可以参与的每个可能的子集之前,您将永久删除输入列表的几个成员。
尝试使用伪代码编制您想要的解决方案,看看是否可以在没有stl干扰的情况下看到问题。
答案 2 :(得分:1)
似乎(我不是母语英语)你可以做的是计算功率集(所有子集的集合),然后只选择匹配条件的子集。
你可以找到如何计算Wikipedia Power set page和Math Is Fun上的权力集的方法(链接位于维基百科页面上的外部链接部分,名为Power Set from Math Is Fun,我不能直接在这里发布,因为垃圾邮件预防机制)。数学很有趣主要是它的二进制。
答案 3 :(得分:0)
我也看不出这应该达到的目标。
如果这不是具有特定限制的作业,我只是建议使用std::includes()
对临时std::set
进行测试。