将原始类型插入到一组集合中

问题描述:

我期待找到一些大小为n的集合的所有子集,例如, {{}, {1}, {1, 2} etc. }使用描述的方法here将原始类型插入到一组集合中

我的问题出现在试图用C++ 11构建一组集合。即,我有一个set<set<int> > permutations其中包含我所有的子集。如果我试图插入一些整数元素i到每个包含在permutations的子集,如下:

for (set<set<int> >::iterator it = permutations.begin(); it != permutations.end(); ++it) 
{ 
    it->insert(i); //error here 
} 

我碰上一个“过载功能的没有实例相匹配的参数列表(该对象具有键入防止限定符匹配”的错误。我的理解是,迭代器itset<int>对象等*it有成员函数insert()。什么是造成出现此特定错误?

+0

'i'的类型是什么?请提供[mcve]。 –

+0

@Carcigenicate集合>的迭代器应该指向1个集合,尽管...不是? – Borgleader

+0

@Borgleader哎呦,你是对的,我的不好。 – Carcigenicate

你不允许修改集合中的元素,因为这会破坏集合使用的内部排序机制您的循环中的*itconst set<int>&。因此,您无法在其上调用插入。

你可以做的是制作一个元素的副本,插入一个元素到副本中,删除原件,并用副本替换它。

for (set<set<int> >::iterator it = permutations.begin(); it != permutations.end();) 
{ 
    auto copy = *it; 
    copy.insert(i); 
    it = permutations.erase(it); 
    permutations.insert(copy); 
} 

注意,如果在一组插入元素使得它等同于另一个,它不会被插入,而你最终会在您所设定的设置少了一个元素。例如,如果您的设置为{{}, {1}, {1,2}},并且i为1,则上面的循环将查看空集,向其添加1(导致{1}),然后当它尝试将该集添加回,因为已经有一组值。

+0

OP想要的东西更有可能(我只是猜测)准备一个集合的全部内容,然后将其插入元集的集合。如果他使用单个集合进行排列,那么他应该插入工作集的元集克隆副本,即突变必须发生在工作集上,而不是插入到元集中。所以我不认为他需要删除+更改+重新插入模式,IMO只需要M次“insert(clone(workingSet))”。 – Ped7g

+0

嗯谢谢你的阐述和提供解决方案。而@Ped7g你是对的,我已经克隆了一个工作集的副本(在'i'的每次迭代中直到n)。 –