C++11sort,vector,lambda——vector自定义排序

更新时间:2023-07-28 01:55:43 阅读: 评论:0

C++11sort,vector,lambda——vector⾃定义排序
前⾔
std::sort⼤法好!很多情况下,快速排序是排序的不⼆选择。#include < algorithm >中的 sort( ),完美的实现了这个快速排序。
std::vector⼤法好!很多情况下,vector是顺序容器的不⼆选择。#include < vector >就可以使⽤了。
lambda⼤法好!这个东西来源⾃“函数式编程“的思想,现在已经影响了⼏乎所有⾯向对象语⾔了:C++11,Java8都已经⽀持lambda。C#, python 等语⾔更早就开始⽀持lambda了。(我理解的lambda就是⼀个“匿名函数”,不知道准不准确,但是貌似可以把我所看见的代码“解释得通了”)
那么把sort( ) 和 vector,lambda相结合,可以擦出什么⽕花呢?
Talk is cheap, show me the code~
#include <iostream>
#include <chrono>
#include <random>
#include <vector>
#include <algorithm>
using namespace std;
class Foo
{
public:
int a;
int b;
Foo():a(0), b(0){}
~Foo(){}
Foo(int a, int b)
{
this->a = a;
this->b = b;
}
// 规定对象排序的算法:先按照 a 从⼩到⼤排序;如果 a 相等,则按照 b 从⼩到⼤排序
bool operator<(const Foo &bar)
{
if (this->a < bar.a)
{
return true;
}
el if (this->a == bar.a)
{
return this->b < bar.b;
}
return fal;
}
// 规定对象排序的算法:先按照 a 从⼤到⼩排序;如果 a 相等,则按照 b 从⼤到⼩排序
bool static decrea(const Foo &foo1, const Foo &foo2)
{电影婚纱
if (foo1.a > foo2.a)
{
return true;
}
el if (foo1.a == foo2.a)
{
return foo1.b > foo2.b;皮肤保养步骤
}
return fal;
}
friend inline ostream & operator<<(ostream &out, Foo &foo)
{
out << foo.a << " " << foo.b << endl;
return out;
glassfiber
}
};
int main()
{
unsigned ed = chrono::system_clock::now().time_since_epoch().count();
minstd_rand0 generator(ed);    // minstd_rand0 is a standard linear_congruential_engine
vector<Foo> myVec(10, Foo());
for (Foo &foo : myVec)          // 随机赋值
{
foo.a = generator() % 5;
foo.b = generator() % 5;
cout << foo;
}
sort(myVec.begin(), d()); // 排序⼀:默认从⼩到⼤,调⽤ operator <
cout << endl << "after sorting using operator <" << endl;
for (Foo &foo : myVec)
{
cout << foo;
}
sort(myVec.begin(), d(), Foo::decrea);  // 排序⼆:按照 Foo::decrea 的规则从⼤到⼩排序
cout << endl << "after sorting using Foo::decrea()" << endl;
for (Foo &foo : myVec)
{
violet怎么读
cout << foo;
}
divanosort(myVec.begin(), d(), [](const Foo &foo1, const Foo &foo2)会计教育
{                                                // 排序三:使⽤ lambda 的⽅式进⾏排序,排序的⽅法和 Foo::decrea ⼀样if (foo1.a > foo2.a)
{
return true;
}
el if (foo1.a == foo2.a)
{
return foo1.b > foo2.b;
}
return fal;
}  );
cout << endl << "after sorting using lambda" << endl;
for (Foo &foo : myVec)
{
cout << foo;
}
spend
system("pau");
return0;
}
运⾏结果
从控制台”⿊框框“复制过来的。(如果你不知道那个⿊框框还可以复制的话,我告诉你:可以复制的!)
44
20
01
14
43stay hungry stay foolish
32
14
03
20
21
after sorting using operator <
01
03
14
14
20
20
21
32
43
44
after sorting using Foo::decrea()
44
43
32
靖国神社是什么意思 21
20
20
14
14
03
01
after sorting using lambda
44
43
32
21
20
20trf
14
14
03
01
请按任意键继续. . .
代码分析
sort其实有3个参数,前两个参数不⽤说,第三个参数是⼀个“函数名字”,默认等于operator<
vector中的元素如果是对象(⽽不是int, double之类的)的话,有以下3种⽅法进⾏⾃定义排序:
1. 对operator<;进⾏重载,这样sort()依然只⽤写两个参数
2. 专门⼀个排序规则的函数,写法参照上述的代码。这个函数可以是静态⽅法,即类⽅法;也可以是全局的⽅法(我认为静态⽅法更
加,毕竟这是专门属于某⼀个类的排序规则)。然后在使⽤sort()的时候,第三个参数写上函数名字即可
3. 使⽤lambda,写法参照上述代码。如果⽐较规则的代码⾏数较少的话,可以使⽤lambda。我个⼈感觉lambda⾥⾯的函数体如果⽐较
长的话,看上去“怪怪”的,可读性⽐较差。据说lambda真正有⽤的地⽅在于多线程,⽤在std::thread, std::future等⾥⾯

本文发布于:2023-07-28 01:55:43,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/190823.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:排序   函数   代码   规则   对象   框框
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图