SLAM学习-C++新特性

任务

请使用C++新特性改写以下函数。该函数功能:将一组无序的坐标按照“Z”字形排序,并输出。

本程序学习目标:
熟悉C++新特性(简化循环、自动类型推导、列表初始化、lambda函数)

题目来源: 从零开始一起学习SLAM | C++新特性要不要学?

sort()函数

定义在 algorithm 头文件中的函数模板 sort() 默认会将元素段排成升序

void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

[first,second)之间的元素进行排序,需要能提供随机访问迭代器的容器如vector,array, deque等.如果提供comp比较器函数,便可根据该函数的要求排序.

comp/cmp

可以直接通过<algorithm>中提供的equal_to<Type>not_equal_to<Type>greater<Type>greater_equal<Type>less<Type>less_equal<Type>库函数实现不同方式 的排序.

#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>
using namespace std;
int main(void)
{
        vector<int> nums;
        nums.push_back(3);
        nums.push_back(9);
        nums.push_back(55);
        nums.push_back(4);
        for(auto i:nums)
                cout<<i<<endl;
        //output:3,9,55,4
        sort(nums.begin(),nums.end());
        copy(begin(nums),end(nums),ostream_iterator<int>(std::cout,"\n"));
        //output:3,4,9,55
        sort(nums.begin(),nums.end(),greater<>());
        copy(begin(nums),end(nums),ostream_iterator<int>(std::cout,"\n"));
        //output:55,9,4,3
        return 0;
}

也可以通过自定义cmp()实现非基本数据类型的比较方式定义,如下面例子所示,实现:

  • 首先比较第一位大小,小者在前
  • 若第一位相同,再比较第二位

完整代码

#include "opencv2/opencv.hpp"
using namespace cv;
using namespace std;
bool cmp(Point2i pt1, Point2i pt2){
    // --- begin ----//
    if(pt1.x!=pt2.x)
        return pt1.x<pt2.x;
    else
        return pt1.y<pt2.y;
    // --- end ----//
}
int main()
{
    vector<Point2i> vec;
    vec.push_back(Point2i(2, 1));
    vec.push_back(Point2i(3, 3));
    vec.push_back(Point2i(2, 3));
    vec.push_back(Point2i(3, 2));
    vec.push_back(Point2i(3, 1));
    vec.push_back(Point2i(1, 3));
    vec.push_back(Point2i(1, 1));
    vec.push_back(Point2i(2, 2));
    vec.push_back(Point2i(1, 2));
    cout << "Before sort: " << endl;
    for (int i = 0; i < vec.size(); i++){
        cout << vec[i] << endl;
    }
    sort(vec.begin(), vec.end(), cmp);
    cout << "After sort: " << endl;
    for (int i = 0; i < vec.size(); i++){
        cout << vec[i] << endl;
    }
    return 0;
}

结果展示

在这里插入图片描述

优化

参考博文C++排序函数中cmp()比较函数详解

思考:int 和const int&有什么区别呢?
原来:作为函数参数:int这种写法是值传递,const int&则是引用传递。
“值传递”——由于函数将自动产生临时变量用于复制该参数,效率较低。
“引用传递”仅借用一下参数的别名而已,不需要产生临时对象。效率较高。
tips:“引用传递”有可能改变参数,const修饰可以解决这个问题。

可以在cmp()的定义处采用引用传递,即:

bool cmp(const Point2i &pt1, const Point2i &pt2)

参考文章

Leave a comment

Your email address will not be published. Required fields are marked *