我上课了:
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;
}
}
有人可以帮我吗? 重要的是,如果元素的参数之一(年龄或名称)不同,那么我打印矢量元素名称和年龄。其他变量值无关紧要。它们可以不同或相同。
答案 0 :(得分: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习语,因为生命太短了。