-1

我有课:

class MyClass {
public:
  void SetName(std::string name) { Name = name; }
  void SetAge(int age) { Age = age; }
  void SetId(int id) { Id = id; }
  void SetNationality(std::string nationality) { Nationality = nationality; }
  //.. other set functions
  std::string GetName() { return Name; }
  int GetAge() { return Age; }
  int GetId { return Id; }
  //.... other Get functions 
Private:
  std::string Name;
  int Age;
  int Id;
  std::string Nationality;
  //... (many other variables)
};

然后我有一个函数用于制作和填充向量 ( std::vector<MyClass> MyVector) 这个函数不是很重要,所以我没有在这里写。

然后我有我使用我的向量的功能:

void MyFun(std::vector<MyClass> vec)
{
  // Now I need to print vector elements Age and Name
  for (std::vector<MyClass>::iterator it = vec.begin(); it != vec.end(); it++) {
    // but if vector has two or more elements which have same Name and Age,
    // I print only the element which has the biggest Id and other elements I 
    // erase from vector
    // if (...) {}          
    std::cout << it->GetName << " :Name; Age: " << it->GetAge << std::endl;
  }
}

有人可以帮我吗?重要的是,如果元素的参数(年龄或名称)之一不同,那么我会打印矢量元素名称和年龄。其他变量值无关紧要。它们可以不同或相同。

4

1 回答 1

1

要删除重复项,您可以先对向量进行排序std::sort,然后使用std::unique删除重复项。如果重复项已经在连续元素中,您可以跳过std::sort并使用std::unique.

为了使这些工作,您需要告诉他们如何比较元素。

bool less_name_age( MyClass const &lhs, MyClass const &rhs ) {
    return lhs.name < rhs.name? true // ascending alphabetical names
         : rhs.name < lhs.name? false
         : lhs.age < rhs.age? true // ascending ages
         : rhs.age < lhs.age? false
         : rhs.id < lhs.id; // descending order of ID
}

bool equal_name_age( MyClass const &lhs, MyClass const &rhs ) {
    return lhs.name == rhs.name && lhs.age == rhs.age;
}

std::sort( vec.begin(), vec.end(), less_name_age );
std::vector< MyClass >::iterator new_end
    = std::unique( vec.begin(), vec.end(), equal_name_age );

我省略了 getter/setter 习语,因为生命太短了。

于 2013-06-04T15:25:51.533 回答