“人造太阳”计划

C++迭代器失效问题

泄露秘密 提交于 2020-03-25 02:37:50
迭代器失效问题一般是指对于stl容器来说,调用erase某迭代器之后,就不能再使用这个iterator了。 解决方法: (1):erase(iter++);这样可以继续使用该iter (2):it=erase(iter);这是利用erase函数的返回值,一般的erase函数都会返回一个删除迭代器的后继迭代器。 如果是erase(iter);iter++;这样不能继续使用iter,它已经失效了。 例子: int main() { set<int> p={1,2,3}; for(auto it=p.begin();it!=p.end();){ if(*it==2){ p.erase(it++); } else{ it++; } } for(auto it=p.begin();it!=p.end();++it){ cout<<*it<<endl; } return 0; } 如果把p.erase(it++);改成p.erase(it);++it;就会报错。 来源: https://www.cnblogs.com/FdWzy/p/12563413.html

迭代器。

情到浓时终转凉″ 提交于 2020-03-24 21:11:34
什么是迭代器! 迭代器指的是迭代取值的工具,其目的通常是为了逼近所需的目标或结果,每一次对过程的重复称为一次“迭代”, 迭代是一个重复的过程,而每一次迭代得到的结果会作为下一次迭代的初始值 每次重复都是基于上一次的结果而继续的,单纯的重复并不是迭代 while True: msg = input('>>: ').strip() print(msg)    为何要有迭代器 迭代器是用来迭代取值的工具,而涉及到把多个值循环取出来的类型 有:列表、字符串、元组、字典、集合、打开文件 要想了解迭代器为何物,必须事先搞清楚一个很重要的概念:可迭代对象(Iterable)。 从语法形式上讲,内置有__iter__方法的对象都是可迭代对象,字符串、列表、元组、字典、集合、打开的文件都是可迭代对象: l=['egon','liu','alex'] i=0 while i < len(l): print(l[i]) i+=1    如何用迭代器 可迭代的对象:但凡内置有__iter__方法的都称之为可迭代的对象 s1='' # s1.__iter__() l=[] # l.__iter__() t=(1,) # t.__iter__() d={'a':1} # d.__iter__() set1={1,2,3} # set1.__iter__() with open('a.txt',mode='w'

机器学习:Python实现聚类算法(二)之AP算法

吃可爱长大的小学妹 提交于 2020-03-24 18:42:52
1.算法简介 AP(Affinity Propagation)通常被翻译为近邻传播算法或者亲和力传播算法,是在2007年的Science杂志上提出的一种新的聚类算法。AP算法的基本思想是将全部数据点都当作潜在的聚类中心(称之为exemplar),然后数据点两两之间连线构成一个网络(相似度矩阵),再通过网络中各条边的消息(responsibility和availability)传递计算出各样本的聚类中心。 2.相关概念(假如有数据点i和数据点j) (图1) (图2) (图3) 1)相似度: 点j作为点i的聚类中心的能力,记为S(i,j)。一般使用负的欧式距离,所以S(i,j)越大,表示两个点距离越近,相似度也就越高。使用负的欧式距离,相似度是对称的,如果采用其他算法,相似度可能就不是对称的。 2)相似度矩阵:N个点之间两两计算相似度,这些相似度就组成了相似度矩阵。如图1所示的黄色区域,就是一个5*5的相似度矩阵(N=5) 3) preference:指点i作为聚类中心的参考度(不能为0),取值为S对角线的值(图1红色标注部分),此值越大,最为聚类中心的可能性就越大。但是对角线的值为0,所以需要重新设置对角线的值,既可以根据实际情况设置不同的值,也可以设置成同一值。一般设置为S相似度值的中值。(有的说设置成S的最小值产生的聚类最少,但是在下面的算法中设置成中值产生的聚类是最少的) 4

PYTHON_DAY_04

馋奶兔 提交于 2020-03-23 06:02:11
目录 一.函数对象 二.函数的嵌套 三.函数名称空间与作用域 四.闭包函数 五.无惨装饰器简单实现 六.装饰器的流程分析及修订 七.有参装饰器的实现及附加多个装饰器流程分析 八.叠加多个装饰器 九.迭代器 十.生成器 十一.内置函数 一:函数对象:函数是第一类对象,即函数可以当作数据传递1. 可以被引用 def foo(): print('from foo') func=foo print(foo) print(func) func()    2. 可以当作参数传递 def foo(): print('from foo') def bar(func): print(func) func()      # 这里在执行foo() 并打印结果 bar(foo) # 这里执行函数bar() 传入的参数func就是foo地址    3. 返回值可以是函数 def foo(): print('from foo') def bar(func): return func f=bar(foo) print(f) f()    4. 可以当作容器类型的元素 def foo(): print('from foo') dic={'func':foo} #这里的value-foo就是函数的地址 print(dic['func']) dic['func']() #利用该特性,优雅的取代多分支的ifdef

Leetcode 136

落花浮王杯 提交于 2020-03-21 11:33:08
class Solution { public: int singleNumber(vector<int>& nums) { unordered_map<int,int> m; for(int i=0;i < nums.size();i++){ m[nums[i]]++; } unordered_map<int,int>::iterator iter; for(iter = m.begin();iter != m.end();iter++){ if(iter->second == 1) return iter->first; } return 0; } }; 这个写法只为熟悉一下map的基本操作,复杂度不符合要求。 class Solution { public: int singleNumber(vector<int>& nums) { int res = 0; for(int num:nums) res ^= num; return res; } }; 异或操作可还行 来源: https://www.cnblogs.com/cunyusup/p/10556090.html

Python迭代器详解

落花浮王杯 提交于 2020-03-20 18:07:43
从for循环说起 我们都知道,在Python中,我们可以for循环去遍历一个列表,元组或者range对象。 for i in [1,2,3]: print(i) for i in range(0,10): print(i) 那底层的原理是什么样的呢?这其中涉及到了几个概念,“可迭代”,“迭代器”,“生成器”等,大部分人可能听过这些名词,但是他们具体的含义以及之间的关系可能没搞清楚,以下就是它们之间的关系图,接下来我们就来分析这个关系图。 可迭代对象与迭代器(先不关心左边的生成器) 如果一个对象是可迭代对象,那么我们就可以用for循环去遍历它,比如列表、元组、字符串等都是可迭代对象。而我们用for循环去遍历它的原理就是,先获取了它的迭代器,然后使用迭代器的next方法去逐一遍历。 a = [1,2,3] # for相当于下面的代码 for i in a: print(i) # for循环分解(实际是通过Python底层C语言实现的,此处只是演示) ## 第一步: 获取迭代器 iterator_a = iter(a) ## 第二步: 通过next逐个遍历 while True: try: print(next(iterator_a)) except StopIteration: ## 第三步:遇到StopIteration异常,停止 break 注意可迭代对象与迭代器的区别

C++ map的基本用法

谁说胖子不能爱 提交于 2020-03-18 13:30:48
C++ map的基本操作和使用(2009-09-23 14:58:21) 标签: cmap编程基本操作livehaiit 分类: Pro.Languages Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,总结了一些map基本简单实用的操作! 1. map最基本的构造函数; map<string , int >mapstring; map<int ,string >mapint; map<sring, char>mapstring; map< char ,string>mapchar; map<char ,int>mapchar; map<int ,char >mapint; 2. map添加数据; map<int ,string> maplive; 1.maplive.insert(pair<int,string>(102,"aclive")); 2.maplive.insert(map<int,string>::value_type(321,"hai")); 3, maplive[112]="April";//map中最简单最常用的插入添加! 3,map中元素的查找: find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。 map<int ,string >::iterator l

c++ Primer 第五版习题答案 第三章

给你一囗甜甜゛ 提交于 2020-03-18 04:43:17
3.2 编写程序,从标准输入中一次读入一整行,然后修改该程序使其一次读入一个词。 void readByLine () { string line; while (getline (cin, line)) { cout << line << endl; } } void readByWord () { string word; while (cin >> word) { cout << word << endl; } } 3.3 说明string类的输入运算符和getline函数分别是如何处理空白字符的。 输入运算符会自动忽略字符串前的空白(空格、制表符、换行等),从第一个真正的字符到下一个空白。 getline函数会保存字符串中的空白,读入数据直到遇见换行符。 3.4 编写程序,读入两个字符串,比较其是否相等并输出结果。如果不相等,输出较大的那个字符串。改写上述程序,比较输入的两个字符串是否等长,如果不等长,输出长度较大的那个字符串。 void compareString () { string s1, s2; cin >> s1 >> s2; if (s1 == s2) { cout << "equal" << endl; } else if (s1 > s2){ cout << s1 << endl; } else { cout << s2 << endl; } } void

PAT 甲级测试题目 -- 1014 Waiting in Line

寵の児 提交于 2020-03-16 21:48:42
题目链接 题目大意 银行有 N 个窗口,窗口前有一条黄线。并且有以下规则 黄线前每个窗口足够容纳 M 名顾客,因此若 N 个队伍都满了,则其余的乘客需要站在黄线外面等候 每名顾客都会选择最短的一队进入黄线区域(黄线内队伍中有顾客办理完成手续了),如果有两队人数一样,则从窗口号较小的队伍插入。 每名顾客都有自己办理业务的时间 业务办理从 8:00 开始,到 17:00 结束。 思路 两种情况: 黄线内的容量大于来办理业务的顾客。   将黄线内的顾客办理业务的时间存起来,因为头一批到达黄线内的顾客按照从左到右的顺序进入队伍就好。因此计算出各自的时间即可。 2.黄线内的容量小于来办理业务的顾客。   将黄线内的顾客办理业务的时间存起来,并计算出每个窗口在黄线内顾客办理完业务后的时间,用于计算后面的顾客办理业务的时间。然后找出每个窗口队伍第一个人办理业务最短的时间,弹出这个元素,并计算当前最短的队伍,然后将 在黄线后面等待的顾客 插入到这个队伍中,并计算对应的时间即可。 坑点 要考虑黄线容纳顾客的情况,可能可以完全容纳,也可能容纳不下 考虑 17:00 这个时间点。原题中的描述: Note that since the bank is closed everyday after 17:00, for those customers who cannot be served before

STL中的map容器的一点总结

守給你的承諾、 提交于 2020-03-16 08:50:48
一、关于map的介绍 map是 STL 的一个容器,和set一样,map也是一种关联式容器。它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,有助于我们处理一对一数据。这里说下map内部数据的组织,map内部是自建一颗红黑树 ( 一种非严格意义上的平衡二叉树 ) ,这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的。学习map我们一定要理解什么是 一对一的数据映射?比如:一个班级中,每个学生的学号跟他的姓名就存在着一一映射的关系,这个模型用map可能轻易描述,很明显学号用int 描述,姓名用字符串描述采用 的 string,于是我们使用的map形式如下:map<int , string> student; 关于map和set底层实现以及效率问题,在另一篇 《STL中set容器的一点总结》 已经说了一些,map和set底层实现都是采用了平衡树来实现的。这里说一下map和set容器的区别。 对于map中的每个节点存储的是一对信息,包括一个键和一个值,各个节点之间的键值不能重复。 对于set中的每个节点存储的是一个信息,只有一个键,但是每个键值也是唯一的。set表示的是集合的概念。 对于map的学习,或者说是对STL中的容器的学习,要知道每种容器的实现原理,每种适合适合解决什么问题的