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

慧生活 20230726

>>> 背景

今天在学一些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)

查看全文

点赞

慧生活

作者最近更新

  • 2025年工业安全传感器市场将重回增长轨道
    慧生活
    2天前
  • 2天40%涨停!深圳传感器公司豪恩汽电 与英伟达合作
    慧生活
    2天前
  • 微型化革命:奥迪威MEMS能量表方案重塑燃气表行业格局
    慧生活
    3天前

期刊订阅

相关推荐

  • 汉威科技:公司传感器已在国际具有一定的知名度和影响力,将力争在传感器行业领域产出更多的创新产品

    传感器专家网 2022-05-26

  • 从源头控制污染:甲烷传感器在油气回收中的应用

    四方光电 2024-09-12

  • 福州大学:可控超大孔结构和高延展性的明胶水凝胶传感器!

    传感器专家网 2022-05-24

  • 国产替代正当其时,四方光电引领柴油发动机氮氧传感器技术突破

    四方光电Cubic 03-14 16:00

评论0条评论

×
私信给慧生活

点击打开传感搜小程序 - 速览海量产品,精准对接供需

  • 收藏

  • 评论

  • 点赞

  • 分享

收藏文章×

已选择0个收藏夹

新建收藏夹
完成
创建收藏夹 ×
取消 保存

1.点击右上角

2.分享到“朋友圈”或“发送给好友”

×

微信扫一扫,分享到朋友圈

推荐使用浏览器内置分享功能

×

关注微信订阅号

关注微信订阅号,了解更多传感器动态

  • #{faceHtml}

    #{user_name}#{created_at}

    #{content}

    展开

    #{like_count} #{dislike_count} 查看评论 回复

    共#{comment_count}条评论

    加载更多

  • #{ahtml}#{created_at}

    #{content}

    展开

    #{like_count} #{dislike_count} #{reback} 回复

  • #{ahtml}#{created_at}

    #{content}

    展开

    #{like_count} #{dislike_count} 回复

  • 关闭
      广告