<C++>sort排序||对结构体进行排序||对一维或二维vector排序

//结构体



#include<algorithm>

struct point
{
	int x;
	int y;
	int dis;//距离 
	int p;
}p[201];

//自拟定排序规则:按dis从小到大排序,如果dis相等按p从小到大排序
bool com(const point p1,const point p2)
{
    if(p1.dis==p2.dis) 
        return p1.p<p2.p;
    
    return p1.dis<p2.dis;
}

int main()
{
    sort(p,p+n,com);
}

//一维vector


vector<int> vec{1,2,3,4};

//默认从小到大排序  1234
sort(vec.begin(),vec.end());
//从大到小排序 4321
sort(vec.begin(),vec.end(),greater<int>());

//二维vector

//二维
vector<vector<int>> vec{{0,2},{1,5},{1,9},{4,6},{5,9},{8,10}};

//默认优先对第一元素进行从小到大排序,第一元素相同的,按照第二元素从小到大排序
sort(vec.begin(),vec.end()); //[0,2],[1,5],[1,9],[4,6],[5,9],[8,10]


//自拟定排序函数



static bool cmp(const vector<int>& v1, const vector<int>& v2){
    //如果第一元素相等,则比较第二元素
    if (v1[0] == v2[0])
        return v1[1] < v2[1];
    return v1[0] > v2[0];
}

vector<vector<int>> vec{{0,2},{1,5},{1,9},{4,6},{5,9},{8,10}};
sort(vec.begin(),vec.end(),cmp);
//[8,10],[5,9],[4,6],[1,5],[1,9],[0,2]

C++ vector 自定义排序规则(vector<vector<int>>、vector<pair<int,int>>)_vector自定义排序-CSDN博客

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我理解你的要求是给定一个 `vector<vector<T>>` 的二维向量 `vkk`,其中 `T` 是一个自定义的结构类型,并且你需要将 `vkk` 按照每个子向量中元素的某个属性进行分组排序,是吗? 如果是这样,那么你可以使用 `std::sort()` 函数和自定义的比较函数来实现这个功能。具实现步骤如下: 1. 定义一个自定义的比较函数 `compareFunc`,该函数接受两个结构类型的参数,返回值为布尔类型。该函数的作用是比较两个结构的某个属性大小,用于排序时判断大小关系。 例如,如果你要按照结构中的 `age` 属性进行排序,那么比较函数可以这样定义: ```cpp bool compareFunc(const T& a, const T& b) { return a.age < b.age; } ``` 2. 对于 `vkk` 中的每个子向量,使用 `std::sort()` 函数进行排序排序时传入自定义的比较函数作为参数。 例如,如果你要对 `vkk` 中的每个子向量按照 `age` 属性进行排序,那么可以这样实现: ```cpp for (auto& vec : vkk) { std::sort(vec.begin(), vec.end(), compareFunc); } ``` 3. 最后,对 `vkk` 中的所有子向量进行分组,将相同属性值的结构放在同一个子向量中。 例如,如果你要按照 `age` 属性将 `vkk` 中的所有结构进行分组,那么可以这样实现: ```cpp std::unordered_map<int, std::vector<T>> groups; for (const auto& vec : vkk) { for (const auto& item : vec) { groups[item.age].push_back(item); } } ``` 其中,使用 `std::unordered_map` 来记录每个属性值对应的结构子向量,然后遍历 `vkk` 中的所有结构,将其添加到对应的子向量中。 完整代码示例: ```cpp #include <iostream> #include <vector> #include <algorithm> #include <unordered_map> struct Person { std::string name; int age; }; bool compareFunc(const Person& a, const Person& b) { return a.age < b.age; } int main() { std::vector<std::vector<Person>> vkk = { {{"Tom", 20}, {"Jack", 25}, {"Lucy", 18}}, {{"Mike", 30}, {"Mary", 21}}, {{"Bob", 22}, {"Alice", 24}, {"John", 26}}, {{"Lisa", 19}, {"David", 29}} }; // 对每个子向量按照 age 属性进行排序 for (auto& vec : vkk) { std::sort(vec.begin(), vec.end(), compareFunc); } // 将所有结构按照 age 属性进行分组 std::unordered_map<int, std::vector<Person>> groups; for (const auto& vec : vkk) { for (const auto& item : vec) { groups[item.age].push_back(item); } } // 输出分组结果 for (const auto& [age, group] : groups) { std::cout << "Age " << age << ": "; for (const auto& item : group) { std::cout << item.name << " "; } std::cout << std::endl; } return 0; } ``` 输出结果: ``` Age 18: Lucy Age 19: Lisa Age 20: Tom Age 21: Mary Age 22: Bob Age 24: Alice Age 25: Jack Age 26: John Age 29: David Age 30: Mike ``` 希望这个答案可以帮助到你,如果还有其他问题,请继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-breezeyy-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值