我知道C ++中的集合不允许重复,但我想要实现的是略有不同。我的程序读取下面表格中的数据文件,导入数据并用它进行一些计算。
如果我通过set1.size()
获取该组的大小计数,它会计算3 9
和3 9
之类的对,因为它不接受重复项。但是,我还希望3 9
和9 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});
}
}
}
答案 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;
显然应该清理一下代码(删除重复等)。