如何从集合中删除重复项

how to remove duplicates from a set?

本文关键字:删除 集合      更新时间:2023-10-16

我知道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)应仅计数一次。我的代码如下,这就是我如何将数据插入到集合中,然后我稍后计算大小。

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

我认为即使这样也可以:

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

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

类似这样的东西:

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;

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