任务
请使用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;
}
结果展示

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