visual擦除C++中结构向量中的重复值

visual Erase the duplicate values in a vector of structures in C++

本文关键字:结构 擦除 C++ visual 向量      更新时间:2023-10-16

我在C++中有一个结构向量。该结构包含一个int和两个字符串变量。我想擦除矢量中的重复值。我试过使用STD::UNIQUE,但我知道这不是正确的方法。请帮我找出解决问题的有效方法。提前谢谢。

您可以通过以下两个步骤完成:

1) 使用std::sort和合适的二进制谓词对向量进行排序。谓词通过实现严格弱排序来设置排序标准。

2) 使用类似于erase-remove习语的std::unique。CCD_ 4必须以应用于步骤1中的排序的相同顺序来调用。

示例:

struct Foo 
{
  int a;
  std::string b, c;
};
// lexicographical comparison provides strict weak ordering
bool cmp(const Foo& lhs, const Foo& rhs)
{
  return std::tie(lhs.a, lhs,b, lhs.c) < std::tie(rhs.a, rhs.b, rhs.c);
}
std::vector<Foo> v = ....
std::sort(vec.begin(), vec.end(), cmp);
vec.erase(std::unique(vec.begin(), vec.end(), cmp), vec.end());

如果你真的不介意初始顺序,那么你可以对向量进行排序,然后使用唯一的方法您有一个struct的向量,因此需要定义一个运算符<。我会在中发布一些代码

假设您有以下结构

struct myStruct
{
    int a;
    string b;
    string c;
}

您需要定义一个运算符来对元素进行排序

inline bool operator <(const myStruct& lhs, const myStruct& rhs)
{
    return (  (lhs.a<rhs.a) 
        || ((lhs.a==rhs.a) && (lhs.b< rhs.b))
        || ((lhs.a==rhs.a) && (lhs.b==  rhs.b) (lhs.cb<  rhs.c)));
}

然后,您需要对向量进行排序,并使用http://www.cplusplus.com/reference/algorithm/unique/

vector<myStruct> vMyStruct;
vMyStruct.push_back(myStruct(1,"abc","abc"));
vMyStruct.push_back(myStruct(2,"abc","abc"));
vMyStruct.push_back(myStruct(1,"abc","abc"));
vMyStruct.push_back(myStruct(2,"def","def"));
vMyStruct.push_back(myStruct(2,"def","ghi"));
vMyStruct.push_back(myStruct(3,"def","ghi"));
std::sort (vMyStruct.begin(), vMyStruct.end());  // using default comparison:
std::vector<myStruct>::iterator it = std::unique (vMyStruct.begin(), vMyStruct.end());