“人造太阳”计划

观察者模式

与世无争的帅哥 提交于 2019-12-17 20:24:26
观察者模式,又叫做发布-订阅(Publish/Subscribe)模式 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使得它们能够自动更新自己。 观察者模式的动机 将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维护一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不方便。而观察者模式的关键对象是主题Subject和观察者Observer,一个Subject可以有任意数目的依赖它的Observer,一旦Subject的状态发生了改变,所有的Observer都可以得到通知。Subject发出通知时并不需要知道谁是它的观察者,也就是说,具体观察者是谁,它根本不需要知道。而任何一个具体观察者不知道也不需要知道其他观察者的存在。 什么时候应该使用观察者模式 当一个对象的改变需要同时改变其他对象的时候。而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式。也可以理解为,当一个抽象模型有两个方面,其中一方面依赖于另一方面,这时用观察者模式可以将这两者封装在独立的对象中使它们各自独立地改变和复用。总的来说,观察者模式所做的工作其实就是在解除耦合。让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响另一边的变化。 工程结构 (1

C++ STL基本容器使用

怎甘沉沦 提交于 2019-12-17 12:31:29
---恢复内容开始--- C++ STL基本容器使用 1:关联容器和顺序容器    c++中有两种类型的容器:顺序容器和关联容器,顺序容器主要有:vector、list、deque等。其中vector表示一段连续的内存地址,基于数组的实现,list表示非连续的内存,基于链表实现。deque与vector类似,但是对于首元素提供删除和插入的双向支持。关联容器主要有map和set。map是key-value形式的,set是单值。map和set只能存放唯一的key值,multimap和multiset可以存放多个相同的key值。 容器类自动申请和释放内存,我们无需new和delete操作。 2:顺序容器的介绍 1):vector,需要包含头文件#include<vector> 主要的操作有 //1.定义和初始化 vector<int> vec1; //默认初始化,vec1为空 vector<int> vec2(vec1); //使用vec1初始化vec2 vector<int> vec3(vec1.begin(),vec1.end());//使用vec1初始化vec2 vector<int> vec4(10); //10个值为0的元素 vector<int> vec5(10,4); //10个值为4的元素 //2.常用操作方法 vec1.push_back(100); //尾部添加元素

浅析python中生成器generator

青春壹個敷衍的年華 提交于 2019-12-16 23:20:05
生成器是什么? Python中,“万物皆对象”,生成器也是一种对象,该对象含有__iter__(), next ()方法,也可被代入iter(),next()方法。当被代入iter()方法,返回一个迭代器(也是一种对象),而生成器本身就是迭代器,即iter(object) is object 的结果为True。 怎么产生生成器? 生成器对象可以通过生成器函数及生成器表达式产生,产生后自动有__next__(), iter ()方法,及可被iter(),next()调用。 生成器函数 这种方法就是在def函数中,使用yield语句: >> > def gen ( N ) : yield N >> > p = gen ( 10 ) >> > type ( p ) < class 'generator' > >> > dir ( p ) [ '__class__' , '__del__' , '__delattr__' , '__dir__' , '__doc__' , '__eq__' , '__format__' , '__ge__' , '__getattribute__' , '__gt__' , '__hash__' , '__init__' , '__init_subclass__' , '__iter__' , '__le__' , '__lt__' , '__name__

python中的next()以及iter()函数

偶尔善良 提交于 2019-12-15 18:11:15
python中的next()以及iter()函数 原创 阿_波_ 发布于2018-02-24 11:51:08 阅读数 3985 收藏 更新于2018-02-24 11:51:08 分类专栏: python3 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/li1615882553/article/details/79360172 收起 我们首先要知道什么是 可迭代的对象 (可以用for循环的对象) Iterable : 一类:list,tuple,dict,set,str 二类:generator,包含生成器和带yield的generatoe function 而生成器不但可以作用于for,还可以被next()函数不断调用并返回下一个值,可以被next()函数不断返回下一个值的对象称为 迭代器:Iterator 生成器都是Iterator对象,但list,dict,str是Iterable,但不是Iterator,要把list,dict,str等Iterable转换为Iterator可以使用 iter() 函数 next()用法: next ( iterator [, default ]) iterator -- 可迭代对象 default -- 可选

C++中set的用法

别来无恙 提交于 2019-12-15 07:49:01
C++中set的用法 1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作。vector封装数组,list封装了链表,map和set封装了二叉树等,在封装这些数据结构的时候,STL按照程序员的使用习惯,以成员函数方式提供的常用操作,如:插入、排序、删除、查找等。让用户在STL使用过程中,并不会感到陌生。 关于set,必须说明的是set关联式容器。set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。应该注意的是set中数元素的值不能直接被改变。C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也成为RB树(Red-Black Tree)。RB树的统计性能要好于一般平衡二叉树,所以被STL选择作为了关联容器的内部结构。 注意: 1、set中的元素都是排好序的 2、set集合中没有重复的元素 关于set有下面几个问题: (1)为何map和set的插入删除效率比用其他序列容器高? 大部分人说,很简单,因为对于关联容器来说,不需要做内存拷贝和内存移动。说对了

iter的特殊用法以及偏函数partial

♀尐吖头ヾ 提交于 2019-12-10 21:49:28
iter()的特殊用法 常规使用 iter(obj),会返现一个迭代器,如果 obj 不是可迭代对象,则会报错。 特殊用法(哨兵模式) iter(object[, sentinel]) sentinel 英文翻译为 哨兵。 sentinel 参数是可选的,当它存在时,object 不再传入一个可迭代对象,而是一个可调用对象,通俗点说就是可以通过()调用的对象,而 sentinel 的作用就和它的翻译一样,是一个“哨兵”,当时可调用对象返回值为这个“哨兵”时,循环结束,且不会输出这个“哨兵”。 实例 实例1 心里想一个[1, 10]范围的数,然后代码开始随机,当随机到想的数时停止,看每次代码需要随机几次。 from random import randint def guess(): return randint(0, 10) num = 1 # 这里先写死心里想的数为5 for i in iter(guess, 5): print("第%s次猜测,猜测数字为: %s" % (num, i)) num += 1 # 当 guess 返回的是 5 时,会抛出异常 StopIteration,但 for 循环会处理异常,即会结束循环 实例2 构造分块读取数据的生成器 from functools import partial def chunked_file_reader(file,

哈希表:正方形

泄露秘密 提交于 2019-12-10 20:01:47
摘一下题目: 正方形 总时间限制: 3500ms 内存限制: 65536kB 描述 给定直角坐标系中的若干整点,请寻找可以由这些点组成的正方形,并统计它们的个数。 输入 包括多组数据,每组数据的第一行是整点的个数n(1<=n<=1000),其后n行每行由两个整数组成,表示一个点的x、y坐标。输入保证一组数据中不会出现相同的点,且坐标的绝对值小于等于20000。输入以一组n=0的数据结尾。 输出 对于每组输入数据,输出一个数,表示这组数据中的点可以组成的正方形的数量。 样例输入 4 1 0 0 1 1 1 0 0 9 0 0 1 0 2 0 0 2 1 2 2 2 0 1 1 1 2 1 4 -2 5 3 7 0 0 5 2 0 样例输出 1 6 1 本来是个大水题,但是首先我把初高中数学知识全给忘了,其次数据量非常大,必须自己手写哈希表。 我最开始的思路是以两个点的中点作为哈希值把这些所有点放进各个桶里,再在每个桶的所有点里面检测。但是这样TLE了……因为n^2级别的数据放进n级别的桶里……再两两比较……代价……emmm 参考了别人的思路,是两两取出点,再计算另外两个点坐标,看是否有这两个点。 我看到的一个哈希表的代码是 最开始的辣鸡代码: # include <iostream> # include <map> # include <vector> # include

C++实现的委托机制简单实现

心不动则不痛 提交于 2019-12-10 15:58:10
转载自https://blog.csdn.net/gouki04/article/details/6852394 1.引言 下面的委托实现使用的MyGUI里面的委托实现,MyGUI是一款强大的GUI库,想理解更多的MyGUI信息,猛击这里 http://mygui.info/ 最终的代码可以在这里下载: http://download.csdn.net/detail/gouki04/3641328 我们的目标是要实现一个跟.NET几乎完全一样的委托,使用简单,支持多播,可以添加删除委托。同时支持C++的普通函数、模板函数、类成员函数,类的静态成员函数,并且支持多态。使用方式如下: // 普通函数void normalFunc(){ cout << "func1" << endl; }class Base{public:// 类成员函数void classFunc(){ cout << "Base func1" << endl; }};int main(){Base b;CMultiDelegate myDelegate;myDelegate += newDelegate(normalFunc);myDelegate += newDelegate(&b, &Base::classFunc);myDelegate(); //

python基础-迭代器

泄露秘密 提交于 2019-12-10 15:24:42
1.迭代:指的是一个重复的过程,每一次重复称为一次迭代,并且每一次重复的结果 是下一次重复的初始值 2.为什么要有迭代器 对于序列类型:str list tuple 可以依赖索引来迭代取值,但是对于dict,set,文件 python必须为我们提供一种不依赖于索引的迭代取值的方式》》》迭代器 3.可迭代的对象:有 obj.__iter__方法 a='asdd' b=[1,2,3,4,5] c=(1,2,3,4) d={'aa':'bb','aac':'vvc'} f=open('a.txt','w',encoding='utf-8') a.__iter__ b.__iter__ c.__iter__ d.__iter__ f.__iter__ 4.迭代器对象:obj.__iter__ , obj.__next__ 同时拥有这两个方法,只有文件是 f.__iter__ f.__next__ 总结:1.可迭代对象不一定是迭代器对象,2.迭代器对象一定是可迭代对象 3.调用obj.__iter__()方法得到的是迭代器对象(对于迭代器对象执行__iter__得到的仍然是它本身) len()等同于obj.__len__() iter 和 next同理 5.for循环详解:1.调用in后边的对象.__iter__()方法拿到迭代器对象2.执行next()方法3

AlexNet网络

依然范特西╮ 提交于 2019-12-10 03:48:22
AlexNet网络的实现 导入必要的工具包 import time import torch from torch import nn , optim import torchvision 添加路径并且根据有无GPU进行选择 import sys sys . path . append ( ".." ) import d2lzh_pytorch as d2l device = torch . device ( 'cuda' if torch . cuda . is_available ( ) else 'cpu' ) 搭建自己的神经网络层 class AlexNet ( nn . Module ) : def __init__ ( self ) : super ( AlexNet , self ) . __init__ ( ) self . conv = nn . Sequential ( nn . Conv2d ( 1 , 96 , 11 , 4 ) , nn . ReLU ( ) , nn . MaxPool2d ( 3 , 2 ) , nn . Conv2d ( 96 , 256 , 5 , 1 , 2 ) , nn . ReLU ( ) , nn . MaxPool2d ( 3 , 2 ) , nn . Conv2d ( 256 , 384 , 3 , 1 , 1 ) ,