【问题标题】:Inserting primitive type into set of sets将原始类型插入到集合中
【发布时间】:2017-08-09 15:12:22
【问题描述】:

我正在寻找某种大小n 的所有子集,例如{{}, {1}, {1, 2} etc. }使用here描述的方法。

我的问题是尝试使用 C++11 构建一组集合。也就是说,我有一个set<set<int> > permutations,其中包含我所有的子集。如果我尝试在permutations 中包含的每个子集中插入一些整数元素i,如下所示:

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

我遇到“没有重载函数的实例与参数列表匹配(对象具有阻止匹配的类型限定符”错误。我的理解是迭代器 it 指的是 set&lt;int&gt; 对象,所以 @987654331 @ 有成员函数insert()。是什么导致了这个特定错误的出现?

【问题讨论】:

  • i的类型是什么?请提供minimal reproducible example
  • @Carcigenicate 集合的迭代器> 应该指向 1 个集合...不是吗?
  • @Borgleader 哎呀,你是对的,我的错。
  • 完整的错误是什么?
  • 你不能修改set中的数据,所以你要么需要不同的容器,要么取内部set,更新并重新插入。

标签: c++ set


【解决方案1】:

不允许修改集合的元素,因为这会破坏集合使用的内部排序机制。所以循环中*it 的类型是const set&lt;int&gt;&amp;。因此,您不能对其调用 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);
}

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

【讨论】:

  • OP 想要的更有可能(我只是在猜测)准备集合的全部内容,然后将其插入到集合的元集中。如果他使用单个集合进行排列,那么他应该将工作集的克隆副本插入到元集中,即突变必须发生在未插入元的工作集上。所以我认为他不需要删除+更改+重新插入模式,IMO他只需要M次“插入(克隆(工作集))”。
  • 啊,感谢您详细说明并提供解决方案。 @Ped7g 你是对的,我已经克隆了工作集的副本(在 i 的每次迭代中,最多 n 个)。
猜你喜欢
  • 2022-10-05
  • 1970-01-01
  • 1970-01-01
  • 2022-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多