1.泛型算法只是作用于迭代器上的,不能真正添加或者删除容器中的元素。
2.泛型算法有很多,不过最常用的无非那么几个,sort排序就是其中之一。
默认的排序是按照<排序的,但是很多时候我们要不要按照<排序,或者更多的时候,我们自己定义的数据类型根本没有<的重载。这时候我们就要自己写一个排序的函数,将函数指针作为参数,传递给sort函数,sort函数就可以根据我们的函数的规则来进行排序了。
源码如下:
// 泛型算法.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <time.h>
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
struct Info
{
int num;
string name;
};
//需要手写一个比较函数
bool compare(const Info& info1, const Info& info2)
{
return info1.num < info2.num;
}
int _tmain(int argc, _TCHAR* argv[])
{
srand((unsigned) time(0));
//定义一个Info的容器,随机添加10个元素
vector<Info> v;
for (int i = 0; i < 10; i++)
{
Info info;
info.num = rand()%10;
info.name = "duang";
v.push_back(info);
}
cout<<"before sort the vector is:"<<endl;
//定义一个Info容器上的const_interator
for (vector<Info>::const_iterator it = v.begin(); it != v.end(); it++)
{
cout<<"num:"<<(*it).num<<" name:"<<(*it).name<<endl;
}
//sort
//使用上面写的compare作为谓词进行排序
sort(v.begin(), v.end(), compare);
cout<<"after sort the vector is:"<<endl;
for (vector<Info>::const_iterator it = v.begin(); it != v.end(); it++)
{
cout<<"num:"<<(*it).num<<" name:"<<(*it).name<<endl;
}
getchar();
return 0;
}
结果:
before sort the vector is:
num:1 name:duang
num:2 name:duang
num:2 name:duang
num:7 name:duang
num:3 name:duang
num:7 name:duang
num:5 name:duang
num:4 name:duang
num:1 name:duang
num:7 name:duang
after sort the vector is:
num:1 name:duang
num:1 name:duang
num:2 name:duang
num:2 name:duang
num:3 name:duang
num:4 name:duang
num:5 name:duang
num:7 name:duang
num:7 name:duang
num:7 name:duang
可见,容器已经按照预想的方式排序完成。
3.lambda表达式:
lambda表达式其实就相当于一个匿名函数,随写随用。
C++中,一个lambda表达式表示一个可调用的代码单元。我们可以将其理解为一个未命名的内联函数。它与普通函数不同的是,lambda必须使用尾置返回来指定返回类型。
上面的例子,排序时,我们需要写一个函数,并将函数作为参数传递给sort函数,这样做很麻烦,使用lambda表达式就可以解决上面的问题。
代码如下:
//lambda表达式的使用
//
#include "stdafx.h"
#include <time.h>
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
struct Info
{
int num;
string name;
};
int _tmain(int argc, _TCHAR* argv[])
{
srand((unsigned) time(0));
//定义一个Info的容器,随机添加10个元素
vector<Info> v;
for (int i = 0; i < 10; i++)
{
Info info;
info.num = rand()%10;
info.name = "duang";
v.push_back(info);
}
cout<<"before sort the vector is:"<<endl;
//定义一个Info容器上的const_interator
for (vector<Info>::const_iterator it = v.begin(); it != v.end(); it++)
{
cout<<"num:"<<(*it).num<<" name:"<<(*it).name<<endl;
}
//使用lambda表达式进行排序
/*
lambda 表达式格式:
[捕获列表](参数....){函数体}
捕获列表:为函数体内要用到的变量,可以使用值捕获,也可以使用引用捕获。如果只写一个=表示隐式值捕获,&表示隐式引用捕获
会自动进行上下文中变量的捕获
参数:任意个参数,与函数类似,也可以传递值或者引用
函数体:表达式中进行的操作
*/
sort(v.begin(), v.end(), [](const Info& info1, const Info& info2){return info1.num < info2.num;});
cout<<"after sort the vector is:"<<endl;
for (vector<Info>::const_iterator it = v.begin(); it != v.end(); it++)
{
cout<<"num:"<<(*it).num<<" name:"<<(*it).name<<endl;
}
getchar();
return 0;
}
没有重新写一个函数,也实现了同样的功能。看起来简洁了很多。lambda 表达式格式:
[捕获列表](参数....){函数体}
捕获列表:为函数体内要用到的变量,可以使用值捕获,也可以使用引用捕获。如果只写一个=表示隐式值捕获,&表示隐式引用捕获
会自动进行上下文中变量的捕获
参数:任意个参数,与函数类似,也可以传递值或者引用
函数体:表达式中进行的操作