C ++ - 从结构化的排序向量中删除重复项

时间:2015-11-11 13:48:13

标签: c++ sorting vector struct duplicates

我的结构如下所示。

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

我有一个结构矢量。我想从该向量中删除重复项。我尝试了以下方法。

  1. 对矢量
  2. 排序
  3. 删除重复项(连续放置)

    vector<Num> arr;

    sort(arr.begin(), arr.end(), num_less);

    arr.erase(std::unique(arr.begin(), arr.end(), num_less);, arr.end());

  4. 但是当我运行上面的代码时,只打印出排序向量的第一个元素,其余部分以某种方式被删除。我不确定我做错了什么。

    编辑 - 我尝试使用std::unique中的num_equal函数。它起作用了。

1 个答案:

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