迭代器

C++ 泛型

ぐ巨炮叔叔 提交于 2019-11-29 02:35:15
泛型 Xun C++标准算法库中的各种函数都有很强的适用性。比如其中的 std::sort 函数,它即可以对 std::vector 中的元素进行排序,也能对 std::deque 中的元素进行排序,对于数组中的元素,它也可以正常运行。同时, std::sort 函数还可以接受一个函数指针(谓词),用来指定排序规则。在这篇文章中,我们将模拟标准库中的 std::sort 函数,写一个与其接口相同的排序函数。 这里排序的方法为归并排序,其主要思想是将两个已排序的短序列合并为一个更长的已排序序列。一般来说,子序列也是无序的,这就需要在函数中对两个短序列进行归并排序。若序列只有一个元素,则它肯定是有序的,递归结束。其动图演示如下:(动图来自互联网) 下面参考一下 std::sort 函数的接口。 std::sort 函数无返回值(或返回 void ),接收两个迭代器指示序列的开始位置和尾后位置,同时还有一个可选参数,用来指定排序规则,其默认使用 < 来进行比较。 于是我们排序函数的接口可能长成这样: template<typename RandIter> void merge_sort ( RandIter iterBeg, RandIter iterEnd, //开始与尾后迭代器 TYPE comp = ...//排序规则 ) 这里的第一行代码说明下面的 RandIter 是一个类名

collection集合--Map

こ雲淡風輕ζ 提交于 2019-11-29 01:56:56
Map (键值对、键唯一、值不唯一) 核心:  Map集合中存储的是键值对,键不能重复,值可以重复。根据键得到值,对map集合遍历时先得到键的set集合,对set集合进行遍历,得到相应的值。 l Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。 l Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。 l Collection中的集合称为单列集合,Map中的集合称为双列集合。 l 需要注意: Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。 . Map集合中包含HashMap(怎么存不一定怎么取)和LinkHahMap(怎么存就怎么取) HashMap 数组方式存储key/value, 线程非安全 , 允许null作为key和value ,key不可以重复,value允许重复,不保证元素迭代顺序是按照插入时的顺序,key的hash值是先计算key的hashcode值,然后再进行计算,每次容量扩容会重新计算所以key的hash值,会消耗资源,要求key必须重写equals和hashcode方法 .HashMap<K,V>(泛型:键,值):存取数据才有的哈希表结果,元素怎么存不一定怎么取,由于要保证键的唯一不重复,需要重写键的hashcode()和equals(

Rust中的迭代器

我的梦境 提交于 2019-11-29 01:49:37
和闭包一样,练代码 struct Counter { count: u32, } impl Counter { fn new() -> Counter { Counter {count: 0 } } } impl Iterator for Counter { type Item = u32; fn next(&mut self) -> Option<Self::Item> { self.count += 1; if self.count < 6 { Some(self.count) } else { None } } } #[test] fn using_other_iterator_trait_methods() { let sum: u32 = Counter::new().zip(Counter::new().skip(1)) .map(|(a, b)| a * b) .filter(|x| x % 3 == 0) .sum(); assert_eq!(18, sum); } 来源: https://www.cnblogs.com/aguncn/p/11438455.html

php yield

怎甘沉沦 提交于 2019-11-29 01:41:25
yield特性一般跟生成器generator紧密联系在一起 Generator implements Iterator { /* Methods */ public mixed current ( void ) public mixed key ( void ) public void next ( void ) public void rewind ( void ) public mixed send ( mixed $value ) public mixed throw ( Exception $exception ) public bool valid ( void ) public void __wakeup ( void ) } 注释:send()方法主要用于发送数据给当前yield,即yield被当作一个值被替换,且继续执行下一个yield,相当于next加current 所谓Generators, 我们以下称为”生成器”, 是一种可以返回迭代器的生成器. 呵呵, 这话有点绕, 让我们看看一个代码, 在没有迭代器之前, 如果我们遍历一个动态生成的数组: <?php function return_array () { $array = dummy (); //计算全部数组内容 return $array ; } foreach ( return_array () as

Java 之 Collection 集合

亡梦爱人 提交于 2019-11-29 00:25:05
一、Collection 集合     Collection :单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是 java.util.List 和 java.util.Set。    List 的特点是 元素有序、元素可重复 。主要实现类有 java.util.ArrayList 和 java.util.LinkedList。    Set 的特点是 元素无序、而且不可重复 。主要实现类有 java.util.HashSet 和 java.util.TreeSet。    下面通过一张图来描述整个 Collection 集合类的基础体系。         其中,红色的为 接口,其他的为具体的实现类。 二、collection集合的常用功能    Collection 是所有单列集合的父接口,因此在 Collection 中定义了单列集合(List 和 Set)通用的一些方法,这些方法可用于操作所有的单列集合。    常用方法: public boolean add(E e): 把给定的对象添加到当前集合中 public boolean remove(E e): 把给定的对象在当前集合中删除 public void clear() : 清空集合中所有的元素 public boolean contains(E e)`: 判断当前集合中是否包含给定的对象

关于STL迭代器中Traits编程方法的学习总结

十年热恋 提交于 2019-11-28 23:11:26
迭代器的相应类型value_type,例:vector<int>::iterator it;迭代器it的类型实际为int *,而这里迭代器的相应类型是指int,,即这里迭代器的相应类型是指迭代对象的类型。 在使用迭代器时,有时可能需要使用迭代器的相应类型value_type,例如当某函数中使用迭代器,需要返回value_type类型的值,而此时我们只知道迭代器的类型,怎么获得该迭代器的value_type? STL中解决该问题方法: 在STL中定义迭代器时,同时有声明内嵌类型value_type,即: 1 template <class T> 2 struct iterator { 3 typedef T value_type; //声明内嵌类型value_type 4 T *ptr; 5 }; 这样在上述需求时可类似如下使用: 1 template <class I> 2 typename I::value_type //返回值类型 3 func_exp(I iter) { 4 return *iter; 5 } typename负责告诉编译器 I::value_type 为一个类型,因为 I 为模板类型,在模板被实例化前,编译器并不知道 I 是什么,也就不知道 I::value_type 表示类型。 但当原生指针作为迭代器时,我们无法为其声明内嵌类型 value_type

3种方式解决iterator迭代器ConcurrentModificationException

孤街浪徒 提交于 2019-11-28 22:53:23
3种方式解决iterator迭代器并发修改异常ConcurrentModificationException 在使用迭代器的时候,时长会遇到 ConcurrentModificationException(并发修改异常) 这也是很多人头疼的问题 并发修改异常产生的原因 在使用迭代器迭代集合的同时,使用原集合修改元素;如果迭代器发现自己和集合不一样,就会抛出 ConcurrentModificationException 异常。 先拿出我写的小案例: Collection<String> list = new ArrayList<>(); list.add("JAVA"); list.add("Python"); list.add("PHP"); Iterator<String> it = list.iterator(); while(it.hasNext()) { if (it.next().equals("PHP")) { list.add("我全都要"); } } 一运行,就抛异常 Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909) at java

interator & vector(迭代器与向量实例)

馋奶兔 提交于 2019-11-28 22:29:45
我们知道可以通过下标运算符‘[]’来访问vector对象的元素。 vector是一种标准库容器,除了vector标准库还有其他的容器。 所有容器都支持迭代器,但只有少数支持下标运算符。所以使用迭代器更加方便,不会出现问题。 下面是一些实例,运行环境是vs2015,在sublime3中不支持。 #include <string.h> #include <vector> #include <iostream> using namespace std; int main() { #if 0 vector 1 vector<int>obj;//创建一个向量存储容器 int for (int i = 0; i<10; i++) // push_back(elem)在数组最后添加数据 { obj.push_back(i); cout << obj[i] << ","; } for (int i = 0; i<5; i++)//去掉数组最后一个数据 { obj.pop_back(); } cout << "\n" << endl; for (int i = 0; i<obj.size(); i++)//size()容器中实际数据个数 { cout << obj[i] << ","; } #endif //新建向量vector //std::vector<int> v1; //std:

Neo4j Cypher查询语言详解

允我心安 提交于 2019-11-28 22:16:59
Cypher介绍 “Cypher”是一个描述性的图形查询语言,允许不必编写图形结构的遍历代码对图形存储有表现力和效率的查询。Cypher还在继续发展和成熟,这也就意味着有可能会出现语法的变化。同时也意味着作为组件没有经历严格的性能测试。 Cypher设计的目的是一个人类查询语言,适合于开发者和在数据库上做点对点模式(ad-hoc)查询的专业操作人员(我认为这个很重要)。它的构念是基于英语单词和灵巧的图解。 Cyper通过一系列不同的方法和建立于确定的实践为表达查询而激发的。许多关键字如like和order by是受SQL的启发。模式匹配的表达式来自于SPARQL。正则表达式匹配实现实用Scala programming language语言。 Cypher是一个申明式的语言。对比命令式语言如Java和脚本语言如Gremlin和JRuby,它的焦点在于从图中如何找回(what to retrieve),而不是怎么去做。这使得在不对用户公布的实现细节里关心的是怎么优化查询。 这个查询语言包含以下几个明显的部分: START:在图中的开始点,通过元素的ID或所以查找获得。 MATCH:图形的匹配模式,束缚于开始点。 WHERE:过滤条件。 RETURN:返回所需要的。 在下例中看三个关键字 示例图片如下: 如:这个有个查询,通过遍历图找到索引里一个叫John的朋友的朋友(不是他的直接朋友

常用算法

非 Y 不嫁゛ 提交于 2019-11-28 21:36:13
sort默认从小到大 排序普通类型 bool complare(int a, int b) { return a < b; // 从小到大, 形参顺序不变, 看大小号判断排序顺序 return a > b; // 从大到小 } int a[10] = { 1, 7, 4, 0, 9, 4, 8, 8, 2, 4 }; sort(a, a + 10); // 数组长度 sort(a, a + 10, complare); 排序vector bool complare(int a, int b) { return a > b; } vector<int> vt; for (int i = 0; i < 10; i++) { vt.push_back(static_cast<int>(rand() % 10)); } for (auto v : vt) cout << v << " "; cout << endl; sort(vt.begin(), vt.end(), complare); for (auto v : vt) cout << v << " "; cout << endl; swap交换两个对象的值 myClass c1, c2; swap(c1, c2); 最值 int a = 1, b = 2; cout << max(a, b) << ' ' << endl;