C C++ 二维数组第一列升序,第一列相同第二列降序_c++二维数组根据第一列排序

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  template<typename _RandomAccessIterator, typename _Compare>
    inline void
    sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
	 _Compare __comp)
	 {...}

  1. 你只需要指定开始、结束的迭代器
  2. 比较方法__comp

下面是一个简单的案例

    /\*\*二维数组第一列升序,第一列相同第二列降序 \*/
    vector<vector<int>> v = {{5, 4}, {6, 4}, {6, 7}, {2, 3}, {5, 2}, {1, 8}};
    sort(v.begin(), v.end(), [](const vector<int> &a, const vector<int> &b) { return a[0] == b[0] ? b[1] < a[1] : a[0] < b[0]; });

    for(const auto& e : v){
        for(const auto& i : e) {
            cout << i << ", ";
        }
        cout << '\n';
    }

下面是输出,可以看出,第一列升序,第一列相同第二列降序

1, 8, 
2, 3, 
5, 4, 
5, 2, 
6, 7, 
6, 4, 

对于通用算法,它的适用性很强,多维也是可以的,只要想好__comp,这里直接用lambda即可

  1. 参数是两个一维数组,一般都是const引用,避免拷贝!!相当于第一次比较的是两个数组{5, 4}, {6, 4}
  2. 之后简单的写出比较方式,返回值是bool,不能在谓词写一些无关的语句,这里只有一个return表示比较方式。

2 C 二维数组第一列升序,第一列相同第二列降序

C语言库函数qsort也是可以的,它也可以使用二维或者高维,但是比较函数必须自己写

extern void qsort (void \*__base, size_t __nmemb, size_t __size,
		   __compar_fn_t __compar);

  1. __base 表示待比较的数组首地址,当然就是数组名咯
  2. __nmemb 表示数组的第一维的大小,对于二维数组就是有多少行,sizeof(v2) / sizeof(v2[0]),也就是6个
  3. __size 表示一个数组的大小,也就是每行的大小,sizeof(v2[0]),也就是2个int大小的存储
  4. __compar比较方法,必须是如下形式
typedef int (\*__compar_fn_t) (const void \*, const void \*);

这是一个别名,对于函数指针的别名,直接去掉typedef(不像一般的别名书写的形式),如下,也就是__compar_fn_t表示两个const void*的形参,返回值是int的函数

int (\*__compar_fn_t) (const void \*, const void \*);

下面是一个案例

int cmp(const void\* a, const void\* b)  {
    return ((int\*)a)[0] == ((int\*)b)[0] ? ((int\*)b)[1] > ((int\*)a)[1] : ((int\*)a)[0] > ((int\*)b)[0];
}

    int v2[6][2] = {{5, 4}, {6, 4}, {6, 7}, {2, 3}, {5, 2}, {1, 8}};
    int hang = sizeof(v2) / sizeof(v2[0]);


![img](https://img-blog.csdnimg.cn/img_convert/9b2d81fb7271eacb898ec5d1a204be22.png)
![img](https://img-blog.csdnimg.cn/img_convert/c6a8d61208c56b5965b213718fc4bb79.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.youkuaiyun.com/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

pics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值