将原始类型插入到一组集合中
我期待找到一些大小为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
}
我碰上一个“过载功能的没有实例相匹配的参数列表(该对象具有键入防止限定符匹配”的错误。我的理解是,迭代器it
指set<int>
对象等*it
有成员函数insert()
。什么是造成出现此特定错误?
你不允许修改集合中的元素,因为这会破坏集合使用的内部排序机制您的循环中的*it
是const 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}
),然后当它尝试将该集添加回,因为已经有一组值。
OP想要的东西更有可能(我只是猜测)准备一个集合的全部内容,然后将其插入元集的集合。如果他使用单个集合进行排列,那么他应该插入工作集的元集克隆副本,即突变必须发生在工作集上,而不是插入到元集中。所以我不认为他需要删除+更改+重新插入模式,IMO只需要M次“insert(clone(workingSet))”。 – Ped7g
嗯谢谢你的阐述和提供解决方案。而@Ped7g你是对的,我已经克隆了一个工作集的副本(在'i'的每次迭代中直到n)。 –
'i'的类型是什么?请提供[mcve]。 –
@Carcigenicate集合>的迭代器应该指向1个集合,尽管...不是? –
Borgleader
@Borgleader哎呦,你是对的,我的不好。 – Carcigenicate