C++ 为什么我不能更改'set<;循环中的值;设置<;int>&燃气轮机`

C++ 为什么我不能更改'set<;循环中的值;设置<;int>&燃气轮机`,c++,C++,以下是我问题的最低功能: 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?

以下是我问题的最低功能:

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);
    }
}
我知道我可以删除一个元素,比如
it=test.erase(it)
,我还知道我可以使用
test.insert()
,那么可以先插入然后删除原始元素吗?但这看起来很麻烦,对吗

*** seconed edited ***
关于用例:在我了解不相交的集合数据结构之前,我想解决它的问题,所以我需要在
set-type-data
中处理
set-type-data
。我发现我无法更改循环中的内部
set
,因此无法合并这些内部集,这让我很不安(或者我可以,我尝试将这些内部集值的元素放入一个temp
set
,然后移除原来的
set
s,然后将temp
set
插入
set
。但它看起来确实很难看)。所以我知道怎么做,但我不知道为什么迭代器是常量,我也想知道一种更好的方法来处理
set
中的
set
s

*** third edited ***
感谢@anurag dhadse指出语法错误

谢谢。

您的
it->insert(1)
尝试更改外部
集合
中的
集合
,这样做可能会更改
*它
应存储在外部
集合
中的位置,这将违反。为了避免这种情况,外部
集合
只允许
常量
访问
集合
元素

如果要修改
集合
元素,需要从外部
集合
修改它,然后
插入
它现在应该去的地方。

您的
它->插入(1)
尝试在外部
集合
内更改
集合
,这样做可能会改变
*它
应该存储在外部
集合
中的位置,这将违反规则,因为没有对元素进行排序。为了避免这种情况,外部
集合
只允许
常量
访问
集合
元素


如果要修改
集合
元素,需要从外部
集合
修改它,然后
插入
它现在应该放回的地方。

您意识到,如果在“外部”集合中插入多个集合,则这些内部集合将按字典顺序排列:

#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";
 }
} 
他们改变了顺序,不仅是每个集合中的整数,而且A1被A3替换(按照字典顺序)

如果将代码>>1 /代码>插入到每一个集合,则[1 1 3 ]将不会改变,[1 1 3 4 8 ]也不会改变,但是[2 7 ]将变成[1 2 7 ],这意味着A1应该再次被A3所交换,因为[Y-YA] < [α],因此C++不允许在迭代期间改变外部集内集的位置。(通过使迭代器为常量)

因此,不清楚为什么要使用集合。 很容易(对于许多应用程序),只需使用集合向量,就可以自由更改它们:

    vector<set<int> > test { A1, A2, A3 } ;
    for(auto& s : test ) {
        s.insert(1); /// inserting 1 in all sets
    }
向量测试{A1,A2,A3};
用于(自动和安全:测试){
s、 插入(1);///在所有集合中插入1
}

您意识到,如果在“外部”集合中插入多个集合,则这些内部集合将按字典顺序排列:

#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";
 }
} 
他们改变了顺序,不仅是每个集合中的整数,而且A1被A3替换(按照字典顺序)

如果将代码>>1 /代码>插入到每一个集合,则[1 1 3 ]将不会改变,[1 1 3 4 8 ]也不会改变,但是[2 7 ]将变成[1 2 7 ],这意味着A1应该再次被A3所交换,因为[Y-YA] < [α],因此C++不允许在迭代期间改变外部集内集的位置。(通过使迭代器为常量)

因此,不清楚为什么要使用集合。 很容易(对于许多应用程序),只需使用集合向量,就可以自由更改它们:

    vector<set<int> > test { A1, A2, A3 } ;
    for(auto& s : test ) {
        s.insert(1); /// inserting 1 in all sets
    }
向量测试{A1,A2,A3};
用于(自动和安全:测试){
s、 插入(1);///在所有集合中插入1
}

std::set::iterator
是一个常量迭代器您不能更改
std::set
的元素,它们是常量。用例是什么?您需要解决的实际问题是什么?为什么您认为一组集合是一个好的解决方案?至于为什么您不能修改外部集合,这是因为集合是有序的,但它们是仅当添加键时才重新排序。添加键后,任何修改键的尝试都会改变排序,并且集合不是这样设计的,因此键是常量。@TonyDelroy您好,我确实认为您的评论足够好,可以作为此问题的答案。是否将其作为答案发布?
std::set::iterator
是一个con静态迭代你不能改变
std::set
的元素,它们是
const
。用例是什么?你需要解决的实际问题是什么?为什么你认为一组集合是一个好的解决方案?至于为什么你不能修改外部集合,这是因为集合是有序的,但它们只有在添加键时才有序。一旦一个键是添加的,任何修改它的尝试都会改变顺序,而集合不是这样设计的,因此键是常量。@TonyDelroy您好,我确实认为您的评论足够好,可以作为此问题的答案。是否将其作为答案发布?非常感谢!集合中的元素对于orde应该有一个名为
less
的方法铃声。我喜欢你的答案,使用vector的方法对我来说是个好主意。很抱歉,我不能接受两个答案。很高兴看到你帮助了越来越多的人。非常感谢!集合中的元素应该有一个名为
less
的排序方法。我喜欢你的答案,使用vector的方法对我的使用来说是个好主意。很抱歉,我不能接受两个答案。很高兴看到你帮助了越来越多的人