Re: Strange errors about set using STL
In article <1151453886.341168.306680@m73g2000cwd.googlegroups.com>,
"Yuri CHUANG" <yuri_1985@126.com> wrote:
This is a example from a textbook,but there are some strange error that
I don't understand.
If the below is an example taken directly from a textbook, burn the book.
Could anyone give me some help to realize the
operations on set.Thank you very much:-)
(I compile it with Dev C++ 4.9.9.2)
#include<iostream>
#include<set>
#include<string>
#include <algorithm>
using namespace std;
typedef set<string> Set;
typedef Set::iterator It;
void print(Set);
Set operator + (Set&,Set&);
Set operator * (Set&,Set&);
Set operator - (Set&,Set&);
int main(void)
{
string str1[]={"A","B","C","D","E","F","G"};
string str2[]={"A","E","I","O","U"};
Set s1(str1,str1+7);
Set s2(str2,str2+5);
print(s1);
print(s2);
print(s1+s2);
print(s1*s2);
print(s1-s2);
return 0;
}
Set operator + (Set& s1,Set& s2)
{
Set s(s1);
s.insert(s2.begin(),s2.end());
return s;
}
Once a value has been inserted into a set, you can't change it. The
error you are getting is complaining that set_intersection and
set_difference are trying to change the values already contained in 's'.
Set operator * (Set& s1,Set& s2)
{
Set s(s1);
It
it=set_intersection(s1.begin(),s1.end(),s2.begin(),s2.end(),s.begin());
s.erase(it,s.end());
return s;
}
Set operator - (Set& s1,Set& s2)
{
Set s(s1);
It
it=set_difference(s1.begin(),s1.end(),s2.begin(),s2.end(),s.begin());
s.erase(it,s.end());
return s;
}
Here are the functions properly written:
Set operator * (const Set& s1,const Set& s2)
{
Set s;
set_intersection( s1.begin(), s1.end(), s2.begin(), s2.end(),
inserter( s, s.begin() ) );
return s;
}
Set operator - (const Set& s1,const Set& s2)
{
Set s;
set_difference( s1.begin(), s1.end(), s2.begin(), s2.end(),
inserter( s, s.begin() ) );
return s;
}
BTW everywhere you have a Set& as a parameter, it should be a const Set&.