如何从一组删除重复?

时间:2014-09-13 00:17:41

标签: c++

我知道C ++中的集合不允许重复,但我想要实现的是略有不同。我的程序读取下面表格中的数据文件,导入数据并用它进行一些计算。

如果我通过set1.size()获取该组的大小计数,它会计算3 93 9之类的对,因为它不接受重复项。但是,我还希望3 99 3之类的内容计为一个。

1    4
5    8
3    9
3    9
9    3
3    0
... so on

所以在上面给出的数据中(只有6行),如果我set1.size(),我希望它说4. (3,9)(3,9)&(9,3)应该只计算一次。我的代码如下,这是我如何将数据插入集合,然后我将COUT大小。

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});                                    
    } 
}
}

2 个答案:

答案 0 :(得分:2)

我认为即使这样也行不通:

if( iss >> j >> k){
   if(j > k) set1.insert({j,k});
   else set1.insert({k,j});
}

答案 1 :(得分:2)

您可以将自己的自定义比较功能添加到一个集合中。然后,您可以将两个不同的对视为相同。

这样的事情:

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;
    }
};

然后使用此声明您的设置:

set<pair<int, int>, MyCompare > set1;

显然应该清理一下代码(删除重复等)。