SLAM学习——C++新特性

7 篇文章 2 订阅

任务

请使用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)

参考文章

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值