我的结构如下所示。
struct Num {
uint64_t key;
uint64_t val;
};
// Compare based on their key and value.
bool num_less(Num a, Num b)
{
if(a.key < b.key)
return true;
else if(a.key == b.key)
{
if(a.val < b.val)
return true;
else
return false;
}
else
return false;
}
// Compare based on their key and value.
bool num_equal(Num a, Num b)
{
return ((a.key == b.key) && (a.val == b.val)) ? true : false;
}
我有一个结构矢量。我想从该向量中删除重复项。我尝试了以下方法。
删除重复项(连续放置)
vector<Num> arr;
sort(arr.begin(), arr.end(), num_less);
arr.erase(std::unique(arr.begin(), arr.end(), num_less);, arr.end());
但是当我运行上面的代码时,只打印出排序向量的第一个元素,其余部分以某种方式被删除。我不确定我做错了什么。
编辑 - 我尝试使用std::unique
中的num_equal函数。它起作用了。
答案 0 :(得分:2)
你需要定义相等的谓词
struct Num
{
unsigned int key;
unsigned int val;
};
bool num_less(const Num &a, const Num &b)
{
return (a.key<b.key)||(!(b.key < a.key))&&(a.val<b.val));
}
bool num_equal(const Num &a, const Num &b)
{
return (a.key==b.key)&&(a.val==b.val);
}
int main()
{
vector<Num> arr;
Num temp;
// add some examples
temp.key=10; temp.val=20;
arr.push_back(temp); arr.push_back(temp);
temp.key=11; temp.val=23;
arr.push_back(temp); arr.push_back(temp);
temp.key=10; temp.val=20;
arr.push_back(temp); arr.push_back(temp); arr.push_back(temp);
//sort
sort(arr.begin(),arr.end(),num_less);
//delete dublicates
arr.erase(unique(arr.begin(),arr.end(),num_equal),arr.end());
return 0;
}