C++ 将基元类型插入到集合集中

C++ 将基元类型插入到集合集中,c++,set,C++,Set,我希望使用所描述的方法查找某个大小集n的所有子集,例如{{}、{1}、{1、2}等 我的问题是试图用C++11构建一组集合。也就是说,我有一个集合置换,它包含我的所有子集。如果我尝试将某个整数元素I插入到置换中包含的每个子集中,如下所示: for (set<set<int> >::iterator it = permutations.begin(); it != permutations.end(); ++it) { it->insert(i); //

我希望使用所描述的方法查找某个大小集
n
的所有子集,例如
{{}、{1}、{1、2}等

我的问题是试图用C++11构建一组集合。也就是说,我有一个
集合置换
,它包含我的所有子集。如果我尝试将某个整数元素
I
插入到
置换
中包含的每个子集中,如下所示:

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

我遇到了一个“没有重载函数的实例与参数列表匹配(对象具有防止匹配的类型限定符)”错误。我的理解是迭代器
it
引用了
set
对象,因此
*it
具有成员函数
insert()
。是什么原因导致出现此特定错误?

不允许修改集合的元素,因为这会破坏集合使用的内部排序机制。因此,循环中的
*it
类型为
常量集&
。因此,无法对其调用insert

您可以做的是制作元素的副本,将元素插入副本,删除原始元素,然后用副本替换它

for (set<set<int> >::iterator it = permutations.begin(); it != permutations.end(); )
{
    auto copy = *it;
    copy.insert(i);
    it = permutations.erase(it);
    permutations.insert(copy);
}
for(set::iterator it=permutations.begin();it!=permutations.end();)
{
自动复制=*它;
副本。插入(i);
它=置换。擦除(它);
排列。插入(副本);
}

请注意,如果在一个集合中插入一个元素使其与另一个相同,则不会插入该元素,并且最终会在集合中减少一个元素集。例如,如果您的集合是
{}、{1}、{1,2}
,并且
i
是1,则上面的循环将查看空集合,向其中添加1(导致
{1}
),然后当它尝试重新添加该集合时,它将失败,因为已经有一个具有该值的集合。

i的类型是什么?请提供。@Carcigenicate集合的迭代器应该指向1集合……不?@Borgleader哇,你说得对,我的错。完全的错误是什么?你不能修改集合中的数据,所以你也不能编辑不同的容器,或者进行内部设置、更新和重新插入。OP想要的更可能(我只是猜测)准备集合的全部内容,然后将其插入集合的元集合。如果他使用单个集合进行排列,那么他应该将工作集合的克隆副本插入集合,即突变必须发生在工作集合上,而工作集合没有插入元集合。所以我认为他不需要删除+更改+重新插入模式,因为他需要s只是M次“插入(克隆(工作集))”。感谢您的详细阐述和提供解决方案。而且@Ped7g您是对的,我已经克隆了工作集的一个副本(在
I
的每次迭代中,最多n次)。