有这么个需求:输入端每次输入两个集合的编号,输入次数不定,集合编号也不定。每次输入结束后,两个集合的值都变成他们的并集。对于第一次输入的集合,集合初始值如下定义:集合A={0},集合B={1},以此类推。若输入的集合在以前出现过,则此时集合的值沿用之前的值。最后输出每个集合的值。
举个例子,若依次输入:(集合A,集合B);(集合B,集合C)
第一次输入运算前:A={0} B={1}
第一次输入运算后:A={0,1} B={0,1}
第二次输入运算前:A={0,1} B={0,1} C={2}
第二次输入运算后:A={0,1} B={0,1,2} C={0,1,2}
使用STL中的set实现:
set <MySet> my_all_set;
void process(MySet a, MySet b)
{
set<MySet>::iterator it_a;
set<MySet>::iterator it_b;
it_a = my_all_set.find(a);
if(my_all_set.end() == it_a){
my_all_set.insert(a);
it_a = my_all_set.find(a);
}
it_b = my_all_set.find(b);
if(my_all_set.end() == it_b){
my_all_set.insert(b);
it_a = my_all_set.find(b);
}
combine(*it_a, *it_b);
}
看出上面程序的错误了吗?
=================================
set <MySet> my_all_set;
void process(MySet , MySet b)
{
set<MySet>::iterator it_a;
set<MySet>::iterator it_b;
it_a = my_all_set.find(a);
if(my_all_set.end() == it_a){
my_all_set.insert(a);
it_a = my_all_set.find(a);
}
it_b = my_all_set.find(b);
if(my_all_set.end() == it_b){
my_all_set.insert(b); //对于每次insert,set的内部结构都会调整,此时一开始的it_a不再指向a了。
it_a = my_all_set.find(b);
}
combine(*it_a, *it_b);
}
=================================
修改后的程序:
set <MySet> my_all_set;
void process(MySet , MySet b)
{
set<MySet>::iterator it_a;
set<MySet>::iterator it_b;
it_a = my_all_set.find(a);
if(my_all_set.end() == it_a){
my_all_set.insert(a);
}
it_b = my_all_set.find(b);
if(my_all_set.end() == it_b){
my_all_set.insert(b);
}
it_a = my_all_set.find(a);//更新my_all_set后再去查it_a,it_b
it_a = my_all_set.find(b);
combine(*it_a, *it_b);
}