【第22期】观点:IT 行业加班,到底有没有价值?

《GeekBand》STL与泛型编程02

原创 2016年08月29日 21:31:26

先看一段关于set的验证程序

//main.cpp
#include <iostream>
#include <string>
#include <set>
#include <functional>
#include <algorithm>

using namespace std;

struct Programmer
{
	Programmer(const int id, const wstring name):Id(id),Name(name){}

	void Print() const
	{
		std::wcout<<L"["<<Id<<L"]:"<<Name<<endl;
	}

	int Id;
	wstring Name;

	void SetName(const wstring n){ Name = n;}
};

class ProgrammerIdGreater
{
public:
	const bool operator()(const Programmer* p1, const Programmer* p2)const 
	{
		return p1->Id > p2->Id ? true : false;
	}

};

class ProgrammerNameComparer
{
public:
	const bool operator()(const Programmer* p1, const Programmer* p2)const 
	{
		return p1->Name < p2->Name ? true : false;
	}

};

int main()
{
	set<Programmer*,ProgrammerIdGreater> s1;

	s1.insert(new Programmer(1, L"Scott Meyers"));
	s1.insert(new Programmer(2, L"Martin Fowler"));
	s1.insert(new Programmer(3, L"Bill Gates"));
	s1.insert(new Programmer(4, L"P.J. Plaught"));
	s1.insert(new Programmer(5, L"Stanley B.Lippman"));
	s1.insert(new Programmer(6, L"Andrei Alexandrescu"));

	cout<<"output set1:\n";

	for_each(s1.begin(), s1.end(), mem_fun(&Programmer::Print));

	cout<<endl<<"Find & changed Programmer(3, L\"Bill Gates\"):\n";

	set<Programmer*,ProgrammerIdGreater>::iterator it = s1.find(new Programmer(3, L"Bill Gates"));

	if(s1.end() != it)
		const_cast<Programmer*>(*it)->SetName(L"David Vandevoorde");

	for_each(s1.begin(), s1.end(), mem_fun(&Programmer::Print));

	set<Programmer*,ProgrammerNameComparer> s2;

	s2.insert(new Programmer(1, L"Scott Meyers"));
	s2.insert(new Programmer(2, L"Martin Fowler"));
	s2.insert(new Programmer(3, L"Bill Gates"));
	s2.insert(new Programmer(4, L"P.J. Plaught"));
	s2.insert(new Programmer(5, L"Stanley B.Lippman"));
	s2.insert(new Programmer(6, L"Andrei Alexandrescu"));

	cout<<"\noutput set2:\n";

	for_each(s2.begin(), s2.end(), mem_fun(&Programmer::Print));


	system("pause");
	return 0;
}

运行结果:



首先看set的概述



可以看到,在上面例子中,我并没有用默认的less排序行为,而是自己定义了2种不同的分别以id和name的排序行为ProgrammerIdGreater和ProgrammerNameComparer;

然后可以看到如果想向set插入元素的采用的是insert函数;

接下来我们通过find函数找到了其中的一个元素,因为set1是采用以id为真正的key来定义的,所以name就是可以改变的,具体改变,需要用到const_cast函数,具体解释看ppt



本周主要介绍了仿函数的一些要点,这些要点其实在上一篇博客中也有提到,这里不再赘述。

例子中还用到了一个仿函数mem_fun,这个仿函数其实就是用来把对象成员函数进行适配的。它还有一个兄弟函数mem_fun_ref,当对象不是指针的时候采用这个仿函数。

以上。

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

《Geekband》STL与泛型编程01

先粘几个《GeekBand》课程中重要的ppt吧。 这一部分内容还是比较多的,只粘这2个概念性的作为代表,粘太多也没什么意义。 接下来是在做作业的时候需要用到的一些知识点。 作业题目: 给...

C++STL泛型编程(一)——set

       2.4set集合容器       set集合容器实现了红黑树(Red-Black Tree)的平衡二叉检索树的数据结构。       在插入元素的时候,他会自动调整二叉树的排列,把该元素放到适当的位置,确保每一个子树根节点的键值大于左子树所有节点的数值,而小于右子树所有节点的键值;另,确保了根节点左子树的高度与右子树的高度相等,这样,二叉树的高度最小,从而检索速度最快。       注意:他不会重复插入相同的键值的元素
  • cyw
  • cyw
  • 2014-11-15 17:08
  • 400

GeekBand C++ STL与泛型编程 第五周笔记

第五周讲到了标准模板库STL,看了下第六周的内容,容器被分成上下,分两周来说。因为笔记内容多为基础概念整理,所以将容器并入标准模板库概念里一起说明。这一周着重整理标准模板库和泛型编程。引用内容来源百度...

C++STL泛型编程(一)—— vector

        一、STL简单介绍         泛型编程的代表作品STL是一种高效、泛型、可交互操作的软件组件。所谓泛型(Genericity),是指具有在多种数据类型上皆可操作的含意,与模板有些相似。         STL巨大,而且可以扩充,它包含很多<a style="text-decoration: none; color: #136ec2;" href="http://ba
  • cyw
  • cyw
  • 2014-11-15 16:52
  • 210

C++STL泛型编程(一)——string

 2.2 string基本字符系列容器——&gt;要包含string库“include&lt;string&gt;”      相当于字符串类,亦可用vector&lt;char&gt;处理字符串,但功能比不上string,或者vector&lt;string&gt;,相当于c语言中的字符串数组。    1.创建string对象 类似于用普通数据类型,定义变量一般。 创建字符串对象时,该字符串是个空字
  • cyw
  • cyw
  • 2014-11-15 16:55
  • 338
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)