0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用C++ sort函数对vector进行自定义排序

冬至配饺子 来源:鸣鸣锣的小屋 作者:Maxwell Luo 2023-07-22 10:12 次阅读

>>> 背景

今天在学一些C++ STL容器,看到sort函数允许自定义排序规则,小小地实操了一下。

>>> 内容

vector

在正式开始使用sort之前,我们先铺垫一些关于vector容器的内容,以及自定义标准输出流,为我们后面的探索铺垫一下。

vector容器是一种动长的模板容器,需要 # include 。定义一个vector对象需要指定元素类型,这个类型可以是基础类型,结构体,自定义类型和vector类型自身(达到嵌套多维vector的目的)。

如下面代码所示,创建了一个元素类型为 int 的vector对象,并使用列表进行初始化。除此之外,还可以使用assign方法进行快速初始化。

// 元素为 1,2,3,4,5
vector< int > vec(5) = {1, 2, 3, 4, 5}; 
// 元素为 1,1,1,1,1
vector< int > vec(5);
vec.assign(1, 5)

还可以创建二维容器,如下所示。注意到此时的模板元素类型参数变成了 vector< int >。

vector< vector< int >> vec2 = {vec, vec, vec, vec, vec};

为了能够方便地打印出vector对象的元素,需要自定义一些输出函数。这里分别对一维和二维的vector容器定义了打印函数(模板)。

template < typename T >
void print1vec(const vector< T >& v) {
    auto iter = v.begin();
    while (iter != v.end()) {
        cout < < *iter < < " ";
        iter++;
    }
    cout < < endl;
}


template < typename T >
void print2vec(const vector< vector< T >>& v) {
    auto iter = v.begin();
    while (iter != v.end()) {
        print1vec(*iter);
        iter++;
    }
    cout < < endl;
}

为了让输出更加优雅和方便,可以重载<<运算符,如下所示。

template < typename T >
ostream& operator< < (ostream& os, const vector< T >& v) {
    auto iter = v.begin();
    while (iter != v.end()) {
        os < < *iter < < " ";
        iter++;
    }
    os < < endl;
    return os;
};


template < typename T >
ostream& operator< < (ostream& os, const vector< vector< T >>& v) {
    auto iter = v.begin();
    while (iter != v.end()) {
        os < < *iter;
        iter++;
    }
    os < < endl;
    return os;
};

sort

使用sort需要 #include 。sort函数最简单的用法如下。第一个参数传入容器的头地址(或指向头元素的迭代器),第二个参数传入容器的尾地址(或指向尾元素的迭代器)的下一个位置(前闭后开的区间)。

int arr[5] = {1, 3, 5, 2, 4};
    sort(arr, arr + 5);
    for (int i = 0; i < 5; ++i)
        cout < < arr[i] < < " ";
>> 1 2 3 4 5

还可以传入第3个参数,即排序判据。该判据由一个函数对象来实现,有两个参数,返回bool值。sort在排序时,会依次把两个元素传入给该函数对象进行判断,如果返回值为true,那么就会把第一个参数代表的元素放到队列中靠前的位置。

因此,可以传入判据函数来快速实现降序排序(这里使用了lambda表达式)。如下所示。

int arr[5] = {1, 3, 5, 2, 4};
sort(arr, arr + 5,
        [](int a, int b) {
            return a > b;
        });
    for (int i = 0; i < 5; ++i)
        cout < < arr[i] < < " ";

5 4 3 2 1

判据函数给了用户自己决定元素比较关系的途径,尤其是对一些非基础类型的数据(如结构、类)可以方便地进行排序。

下面就创建了一个结构体 ,并规定如果该结构体的两个成员的平方和越小,排序越靠前。

struct Point {
    int x; 
    int y;
};


ostream& operator< < (ostream& os, const Point& p) {
    os < < "(" < < p.x < < ", " < < p.y < < ")";
    return os;
};
vector< Point > vec3;
Point p1 = {1, 1};
Point p2 = {-3, -3};
Point p3 = {2, 2};
vec3.push_back(p1);
vec3.push_back(p2);
vec3.push_back(p3);
cout < < "vec3: " < < endl;
cout < < vec3;
sort(vec3.begin(), vec3.end(),
    [](Point a, Point b){
        return a.x * a.x +  a.y * a.y < b.x * b.x +  b.y * b.y;
    });
cout < < vec3;
> > vec3:
(1, 1) (-3, -3) (2, 2)
(1, 1) (2, 2) (-3, -3)
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C++语言
    +关注

    关注

    0

    文章

    146

    浏览量

    6878
  • STL算法
    +关注

    关注

    0

    文章

    6

    浏览量

    5338
  • 迭代器
    +关注

    关注

    0

    文章

    43

    浏览量

    4271
收藏 人收藏

    评论

    相关推荐

    OpenHarmony自定义组件

    **可通过@Builder装饰器进行描述,该装饰器可以修饰一个函数,此函数可以在build函数之外声明,并在build函数中或其他@Buil
    的头像 发表于 12-08 12:26 1440次阅读

    新手请教一个关于MATLAB自定义函数的问题?

    我请教大家一个MATLAB的问题,就是关于自定义函数的。假如我的一个程序里面有我自定义的一个函数,以前的做法就是把这个自定义
    发表于 04-11 08:53

    CC1310不调用库函数,怎么自定义ISR?

    vector=1__interrupt void TRAP_IRQHandler(void){}来自定义一个中断服务处理函数ISR?
    发表于 03-09 11:05

    自定义Kmeans函数对多个坐标点进行自动分类的实现

    ML之Kmeans:利用自定义Kmeans函数实现对多个坐标点(自定义四个点)进行自动(最多迭代10次)分类
    发表于 12-25 10:51

    OpenHarmony自定义构建函数:@Builder装饰器

    前面章节介绍了如何创建一个自定义组件。该自定义组件内部UI结构固定,仅与使用方进行数据传递。ArkUI还提供了一种更轻量的UI元素复用机制@Builder,@Builder所装饰的函数
    发表于 09-26 16:36

    matlab自定义函数调用的方法

    matlab自定义函数调用的方法 命令文件/函数文件+ 函数文件 - 多
    发表于 11-29 13:14 88次下载

    自定义函数测试学习工程

    自定义函数测试学习工程
    发表于 07-01 16:37 5次下载

    1602自定义字符

    1602液晶能够显示自定义字符,能够根据读者的具体情况显示自定义字符。
    发表于 01-20 15:43 1次下载

    erlang如何自定义_ERLANG环境搭建

    本文详细介绍了erlang 如何自定义 behaviour以及ERLANG环境搭建。要定义一个behaviour,首先你要创建一个模块,它必须导出 behaviour_info/1 这个函数(注意必须带u),
    发表于 02-23 08:42 1383次阅读
    erlang如何<b class='flag-5'>自定义</b>_ERLANG环境搭建

    Linux系统中sort排序命令的使用教程

    sort命令的功能是对文件中的各行进行排序sort命令有许多非常实用的选项,这些选项最初是用来对数据库格式的文件内容进行
    发表于 04-02 14:33 327次阅读

    自定义视图组件教程案例

    自定义组件 1.自定义组件-particles(粒子效果) 2.自定义组件- pulse(脉冲button效果) 3.自定义组件-progress(progress效果) 4.
    发表于 04-08 10:48 14次下载

    如何自定义函数或局部脚本

    系统函数是所有随 WinCC 一同提供的函数。系统函数可应用在函数列表、用户自定义函数或局部脚本
    的头像 发表于 10-10 10:45 1067次阅读

    labview超快自定义控件制作和普通自定义控件制作

    labview超快自定义控件制作和普通自定义控件制作
    发表于 08-21 10:32 5次下载

    sort函数python用法

    sort()函数是Python中的内置函数之一,用于对可迭代对象进行排序。可迭代对象包括列表、元组和字符串等。
    的头像 发表于 11-21 15:15 692次阅读

    博途用户自定义库的使用

    博途官方提供了很多库,比如:基本函数库、通信库、安全库、驱动库等等,用户可以使用库中的函数/函数块来完成具体的控制任务。除了官方的库,我们也可以创建自己的库(用户自定义库)。比如,把项
    的头像 发表于 12-25 10:08 291次阅读
    博途用户<b class='flag-5'>自定义</b>库的使用