为什么我无法更改"set<set>"循环中的值<int>

why I cannot change the value in loop of `set<set<int>>`

本文关键字:set gt lt int 循环 为什么      更新时间:2023-10-16

这是我的问题的最小函数:

void solve(void)
{
set<set<int> > test;
for(set<set<int> >::iterator it = test.begin(); it != test.end(); ++it) {
// (*it)'s type is set<int> right? but why I cannot insert a int into this?
it -> insert(1);
}
}

编译器告诉我no matching function for call to 'std::set<int>::insert(int) const'

我真的很困惑,为什么它不使用没有conststd::set<int>::insert(int)?我该怎么做?我真的能做到吗?

*** first edited ***

我知道我可以擦除像it = test.erase(it)这样的元素,我也知道我可以使用test.insert(<a set<int> value>),所以可以先插入然后删除原始元素吗?但是看起来很麻烦,对吧?

*** seconed edited ***

关于用例:在我知道Disjoint集数据结构之前,我想解决它的问题,所以我需要处理set<set<int>> type data中的set<int> type data。我发现我无法更改循环中的内部set,因此无法合并这些内部集,这让我很沮丧。(或者我可以,我尝试将内部集值的那些元素放入临时set中,然后删除原始sets,然后将临时set插入set<set>中。它看起来确实很难看(。所以我知道要做它,但我不知道为什么迭代器是const,我也想知道在set中处理set的更好方法。

*** third edited ***

感谢@anurag dhadse指出语法错误。

谢谢。

您的it->insert(1)试图更改外部set<set<int>>中的set<int>,这样做可能会更改*it在外部set中的存储位置,这将通过不保持元素排序而违反类不变量。为了避免这种情况,外部set只允许itconst访问set<int>元件

如果你想修改一个set<int>元素,你需要从外部setextract,修改它,然后insert把它放回它现在应该放的地方。

您意识到,如果您在一个"外部";集合,这些内部集合将按字典顺序排列:

#include <set>
#include <vector>
#include <iostream>
using namespace std;
int main () {
set A1 = {2, 7};
set A2 = {1, 8, 3, 4};
set A3 = {1, 4, 3};
set<set<int>> set_of_sets;
set_of_sets.insert(A1);
set_of_sets.insert(A2);
set_of_sets.insert(A3);
for ( auto& inner_set : set_of_sets ) {
std::cout << "[ " ;
for ( auto &element :  inner_set ) {
std::cout << element << " ";
}
std::cout << "]n";
}
} 

将产生以下响应:

[ 1 3 4 ]
[ 1 3 4 8 ]
[ 2 7 ]

他们改变了顺序,不仅改变了每个集合中的整数,而且A1被A3(遵循字典顺序(交换

https://godbolt.org/z/nacxrn

如果将1插入到每个集合中,[1 3 4]将不会更改,[1 3 4 8]也不会更改,但[2 7]将变为[1 2 7],这意味着A1应该再次被A3替换,因为[1 2 7]<[1 3 4],因此C++不允许在迭代过程中更改内集在外集内的位置(通过使迭代器常量(。

所以,现在还不清楚你为什么要使用一个集合。(对于许多应用程序(只需使用集合的向量,就可以自由更改它们:

vector<set<int> > test { A1, A2, A3 } ;
for(auto& s : test ) {
s.insert(1); /// inserting 1 in all sets
}

https://godbolt.org/z/WMvse9