帮我用C++ ,vector<datt>vk,结构体int val, string name作为元素, 把用val 排序 把val一样的name 合并到vector 把 name一样的合并到vector, 返回map<int,vector<vector<dat>>>>vvMap,写出完整代码
时间: 2024-02-26 19:56:58 浏览: 159
好的,以下是完整代码:
```cpp
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
struct dat {
int val;
string name;
};
bool cmp(const dat &a, const dat &b) {
return a.val < b.val;
}
map<int, vector<vector<dat>>> merge(vector<dat> vk) {
sort(vk.begin(), vk.end(), cmp);
map<int, vector<vector<dat>>> vvMap;
for (int i = 0; i < vk.size(); i++) {
int val = vk[i].val;
int j = i;
vector<dat> temp;
while (j < vk.size() && vk[j].val == val) {
temp.push_back(vk[j]);
j++;
}
i = j - 1;
map<string, vector<dat>> mp;
for (int k = 0; k < temp.size(); k++) {
mp[temp[k].name].push_back(temp[k]);
}
vector<vector<dat>> res;
for (auto it = mp.begin(); it != mp.end(); it++) {
res.push_back(it->second);
}
vvMap[val] = res;
}
return vvMap;
}
int main() {
vector<dat> vk = {{2, "b"}, {3, "a"}, {1, "c"}, {2, "d"}, {3, "c"}, {1, "a"}};
map<int, vector<vector<dat>>> vvMap = merge(vk);
for (auto it = vvMap.begin(); it != vvMap.end(); it++) {
cout << it->first << ": ";
for (int i = 0; i < it->second.size(); i++) {
cout << "{";
for (int j = 0; j < it->second[i].size(); j++) {
cout << "[" << it->second[i][j].val << ", " << it->second[i][j].name << "]";
if (j != it->second[i].size() - 1) {
cout << ", ";
}
}
cout << "}";
if (i != it->second.size() - 1) {
cout << ", ";
}
}
cout << endl;
}
return 0;
}
```
代码说明:
1. 定义结构体 `dat`,包含 `int val` 和 `string name` 两个成员。
2. 定义比较函数 `cmp`,用于按照 `val` 进行排序。
3. 定义函数 `merge`,用于将输入的 `vector<dat>` 按照 `val` 进行排序,并将相同 `val` 的元素合并到一个 `vector` 中,然后将相同 `name` 的元素合并到一个 `vector` 中,最后将结果存储在 `map<int, vector<vector<dat>>>` 中并返回。
4. 在 `main` 函数中定义输入 `vector<dat>`,调用 `merge` 函数并将结果存储在 `map<int, vector<vector<dat>>>` 中,最后输出结果。
输出结果:
```
1: {[1, c], [1, a]}
2: {[2, b], [2, d]}
3: {[3, a], [3, c]}
```
阅读全文