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
,因此无法合并这些内部集,这让我很不安(或者我可以,我尝试将这些内部集值的元素放入一个tempset
,然后移除原来的set
s,然后将tempset
插入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的方法对我的使用来说是个好主意。很抱歉,我不能接受两个答案。很高兴看到你帮助了越来越多的人