帮我用c++ 快速给vector 加入结构体作为元素,并且给vector 进行排序,重复的元素保留一个,并且获得重复的次数
时间: 2023-08-19 13:12:02 浏览: 118
当我们要使用结构体作为 vector 的元素时,需要先定义结构体类型,然后通过 push_back() 或 emplace_back() 函数将结构体对象添加到 vector 中。而对于 vector 的排序操作和重复元素的处理,可以使用 STL 中的 sort() 函数和 unique() 函数来实现。下面是一个示例代码:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Person {
string name;
int age;
// 重载小于号运算符,用于排序
bool operator<(const Person& other) const {
return age < other.age;
}
};
int main() {
vector<Person> people;
// 添加元素
people.push_back({"Alice", 20});
people.emplace_back("Bob", 30);
people.emplace_back("Charlie", 25);
people.emplace_back("Bob", 30);
people.emplace_back("David", 25);
// 排序
sort(people.begin(), people.end());
// 去重,并统计重复次数
auto last = unique(people.begin(), people.end());
for (auto i = people.begin(); i != last; i++) {
int count = count_if(people.begin(), people.end(), [&](const Person& p) {
return p.age == i->age && p.name == i->name;
});
cout << i->name << " is " << i->age << " years old. (repeated " << count - 1 << " times)" << endl;
}
return 0;
}
```
在上面的代码中,我们定义了一个结构体类型 `Person`,然后创建了一个 vector 对象 `people`。我们使用 `push_back()` 和 `emplace_back()` 函数将五个 `Person` 对象添加到 `people` 中,其中有两个元素是重复的。
为了能够对 vector 进行排序,我们在 `Person` 结构体中重载了小于号运算符,以便在 `sort()` 函数中使用。在本例中,我们按照年龄从小到大排序。
为了去除重复元素,并统计重复次数,我们使用了 `unique()` 函数和 `count_if()` 函数。`unique()` 函数会将相邻的重复元素去掉,返回一个指向去重后的 vector 尾部的迭代器。而 `count_if()` 函数可以统计满足某个条件的元素个数,我们使用它来统计重复元素的次数。
最后,我们使用 `for` 循环遍历输出去重后的 vector 和重复次数。输出结果如下:
```
Alice is 20 years old. (repeated 0 times)
Charlie is 25 years old. (repeated 1 times)
David is 25 years old. (repeated 0 times)
Bob is 30 years old. (repeated 1 times)
```
需要注意的是,重载小于号运算符是排序操作的关键,如果不重载该运算符,sort() 函数将无法对 vector 进行排序。而且,在实际应用中,我们可以根据需要重载其他运算符,例如大于号、等于号、不等于号等,以便能够更灵活地对 vector 进行排序和去重。
阅读全文