从自定义数据类型向量中删除重复的元素

时间:2018-08-13 16:11:29

标签: c++ algorithm vector

我正在尝试删除重复的矢量元素。首先,我对元素进行排序,然后查找重复项。我重载了排序功能,但不确定如何擦除零件。

class cp_data
{
    public:
    int num;
    char name;
    cp_data(int a, char b)
    {
        num = a;
        name = b;
    }
};
int main()
{
    std::vector<cp_data> data;
    cp_data data1(1, 'a');
    cp_data data2(2, 'b');
    cp_data data3(1, 'a');
    cp_data data4(2, 'b');
    data.push_back(data1);
    data.push_back(data2);
    data.push_back(data3);
    data.push_back(data4);
    std::sort( data.begin(), data.end(), []( const cp_data& lhs, const cp_data& rhs )
    {
        return lhs.num< rhs.num;
    });   
    data.erase(unique(data.begin(), data.end()), data.end());
    system("pause");
}

此代码给出以下错误。

  

错误C2672'运算符__surrogate_func':没有匹配的重载函数    错误C2893无法专用于功能模板'unknown-type std :: equal_to :: operator()(_ Ty1 &&,_ Ty2 &&)const'

1 个答案:

答案 0 :(得分:5)

问题是unique不知道如何与元素进行相等性比较。您没有提供operator==(const cp_data& lhs, const cp_data& rhs)或类似的内容,因此unique不知道什么构成“相等”元素。可以使用另一个lambda轻松解决此问题:

int main()
{
    // [...]
    auto lessThanLambda = []( const cp_data& lhs, const cp_data& rhs )
    {
        return lhs.num< rhs.num;
    };   

    std::sort( data.begin(), data.end(), lessThanLambda);

    auto equalLambda = [](const cp_data& lhs, const cp_data& rhs)
    {
        return lhs.num == rhs.num;
    }

    data.erase(unique(data.begin(), data.end(), equalLambda), data.end());
}