How do I remove duplicates from a set?
I know that C ++ sets do not allow duplication, however what I am trying to achieve is slightly different. My program reads a data file in the form below, imports the data and does some calculations with it.
If I take the number of counts of a set through set1.size()
, it will count pairs like 3 9
and 3 9
, times, since it does not accept duplicates. However, I also want something like 3 9
and 9 3
count as one.
1 4
5 8
3 9
3 9
9 3
3 0
... so on
So in the above data (only 6 lines), if I did set1.size()
, I want to say 4. (3,9)(3,9)&(9,3)
should only be counted once. My code is below, this is how I insert data into a set and then I COUT the size later.
string in;
set<pair<int, int> > set1;
while (getline(fs, in)) {
istringstream iss(in);
int j, k;
if (iss >> j >> k) {
set1.insert({j, k});
}
}
}
You can add your own comparison function to the set. Then you can handle two different pairs the same way.
Something like that:
class MyCompare
{
public:
bool operator () (const pair<int, int> &left, const pair<int, int> &right)
{
pair<int, int> orderedLeft = left;
if (orderedLeft.first > orderedLeft.second)
swap(orderedLeft.first, orderedLeft.second);
pair<int, int> orderedRight = right;
if (orderedRight.first > orderedRight.second)
swap(orderedRight.first, orderedRight.second);
return orderedLeft < orderedRight;
}
};
Then declare your collection using this:
set<pair<int, int>, MyCompare > set1;
Obviously the code needs to be cleaned up a bit (remove duplication, etc.).
source to share