《C++Prinmer》读书笔记(7)

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 表达式格式:
[捕获列表](参数....){函数体}
捕获列表:为函数体内要用到的变量,可以使用值捕获,也可以使用引用捕获。如果只写一个=表示隐式值捕获,&表示隐式引用捕获
 会自动进行上下文中变量的捕获
参数:任意个参数,与函数类似,也可以传递值或者引用
函数体:表达式中进行的操作


你可能感兴趣的:(C++,读书笔记,泛型,迭代器,C++11)